2012-05-21 2 views
7
struct test_struct 
{ 
    test_struct() {} 
    ~test_struct() {} 
}; 

#include <vector> 
#include <memory> 
#include <cstdio> 

int main() 
{ 
    printf("ctor begin\n"); 
    { 
     std::vector<std::unique_ptr<test_struct>> test_vec; 
     const int count = 100000; 

     for (auto i = 0; i < count; i++) { 
      test_vec.emplace_back(new test_struct); 
     } 
     printf("dtor begin\n"); 
    } 
    printf("dtor end\n"); 
} 

私はVS2010を使用しています、といくつかのばかげたパフォーマンスの問題を発見しました。上のコードは、デバッグとリリースビルド(ctrl + f5)の両方でうまく動作しますが、デバッガが接続されている(f5)場合、unique_ptrクラスのdtorコールは耐え難いほど遅いです。結果のマシンコードはかなり最適化されているので、デバッガではなくコンパイラの問題ではないと思っていますが、対処方法はわかりません。私の質問はとてつもなく遅いのunique_ptrをデストラクタの呼び出し(MSVC)

  • この問題はあなたのマシンで再現できますか?
  • この現象の原因は何ですか?
  • 回避策はありますか?
+0

各プリント後にフラッシュを試してください。 – Pubby

+0

@Pubby:違いはありません。それぞれのループ反復ごとに1つではなく、3つのprintfの合計があります。 –

+0

VS2010 Express Editionでこれを再現することができました。 – RedX

答えて

6

減速は、メモリが解放されるたびに発生するメモリチェックによって発生します。しかし、これは特殊なシステム/デバッガレベルのヒープであり、プログラム内で制御できるものではありません。

great article on the issueがあります。要約すると、それを無効にするには環境変数を設定する必要があります。

幸いにも、環境変数がプログラムにのみ適用されるように、プロジェクト固有の環境変数をプロジェクトのプロジェクト設定のデバッグオプションから設定することができます。私は試験に、この単純化されたプログラムに使用

:(Iおすすめ、またはデバッグオプションを使用していないであろう、システム全体のいずれか)環境変数として_NO_DEBUG_HEAP=1を設定することにより

#include <iostream> 
#include <memory> 
#include <vector> 

int main() 
{ 
    std::cout << "ctor begin" << std::endl; 
    { 
     std::vector<std::unique_ptr<int>> test_vec; 

     for (unsigned i = 0; i < 100000; i++) 
      test_vec.emplace_back(new int); 

     std::cout << "dtor begin" << std::endl; 
    } 
    std::cout << "dtor end" << std::endl; 
} 

を、コードがで実行されデバッガが接続されているかどうかにかかわらず、ほぼ同じ時間です。

関連する問題