2016-07-12 4 views
0

make_sharedパフォーマンス(boostまたはstl)について私が理解していることについて少し疑問があります。make_shared(boostまたはstl)は私のテストでshared_ptr + newよりやや遅いようです。

C++でのアプリケーションの作業パフォーマンステストを行う必要がありましたが、make_sharedとshared_ptr + newを比較することになりました(パフォーマンス改善の目的ではないことに注意してください。しかし、私は1.55

  • のgcc 4.9.2
  • liboost

    • Debianのジェシーのx64
    • を使用)今だけ

      興味10

      私は、make_sharedがより効率的であることを読んでいます。割り振り番号(オーバーヘッド)を見ればわかります(私が理解できる限り)。

      しかし、迅速かつ愚かなテストをやって、私は

       std::shared_ptr<MyUselessClass> dummyPtr = std::shared_ptr<MyUselessClass>(new MyUselessClass()); 
          auto start = boost::chrono::high_resolution_clock::now() ; 
      
          // - STD Share 
          std::shared_ptr<MyUselessClass> stdSharePtr = std::shared_ptr<MyUselessClass>(new MyUselessClass()); 
          auto stdSharePtrTime_1 = boost::chrono::high_resolution_clock::now() ; 
      
          // - STD Make 
          std::shared_ptr<MyUselessClass> stdMakePtr = std::make_shared<MyUselessClass>(); 
          auto stdMakePtrTime_2 = boost::chrono::high_resolution_clock::now() ; 
      
          // - BOOST Share 
          boost::shared_ptr<MyUselessClass> boostSharePtr = boost::shared_ptr<MyUselessClass>(new MyUselessClass()); 
          auto boostSharePtrTime_3 = boost::chrono::high_resolution_clock::now() ; 
      
          // - BOOST Make 
          boost::shared_ptr<MyUselessClass> boostMakePtr = boost::make_shared<MyUselessClass>(); 
          auto boostMakePtrTime_4 = boost::chrono::high_resolution_clock::now() ; 
      
          boost::chrono::nanoseconds stdShare = boost::chrono::duration_cast<boost::chrono::nanoseconds>(stdSharePtrTime_1-start) ; 
          boost::chrono::nanoseconds stdMake = boost::chrono::duration_cast<boost::chrono::nanoseconds>(stdMakePtrTime_2-stdSharePtrTime_1) ; 
          boost::chrono::nanoseconds boostShare = boost::chrono::duration_cast<boost::chrono::nanoseconds>(boostSharePtrTime_3-stdMakePtrTime_2) ; 
          boost::chrono::nanoseconds boostMake = boost::chrono::duration_cast<boost::chrono::nanoseconds>(boostMakePtrTime_4-boostSharePtrTime_3) ; 
      
          cout << "---" << endl ; 
          cout << "STD share " << stdShare << endl ; 
          cout << "BOOST share " << boostShare << endl ; 
          cout << "STD make " << stdMake << endl ; 
          cout << "BOOST make " << boostMake << endl ; 
      

      得るかを理解していないMyUselessClassは3クラス属性(刺す、ブール値、int型)、そして唯一のコンストラクタとdesctructorと単純なクラスです。

      「結果」(それが正確なテストではありませんので、私はもちろん、引用)(私は同じ結果を、多くの反復を取得するためにループにそれをrunned平均になります)、次のとおりです。

      STD share 162 nanoseconds 
          BOOST share 196 nanoseconds 
          STD make 385 nanoseconds 
          BOOST make 264 nanoseconds 
      

      私がテストを信じるなら、make_sharedはshare_ptrを新しいインスタンスに呼び出すよりも少し遅いです。

      • を多分私のテストがあまりにも愚かである、nanosecons順序がには重要性を持っていない:私は、逆にナノ秒の精度など任意の違いを確認した場合、私は、だから今、私は疑問に思って...、

        を期待しているだろうその操作は?

      • 多分私はmake_sharedのより良いパフォーマンスの説明で一点を逃したのでしょうか?
      • 多分私はテストでいくつか(serveral)ポイントを逃したのですか?あなたは以下の点のいくつかの答えを持っている場合は

      、躊躇しないでください:)

      ありがとう

    +0

    共有ポインタを作成する呼び出しを1回だけ測定する必要はありません。ループ内に多くのポインタを割り当てて比較してください。 –

    答えて

    0

    -O2を使用してプログラムをコンパイルしてみます。私は最適化せずにあなたのコードをコンパイルしようとしたと私は同様の番号を持っています。コードを-O2でコンパイルした後、make_sharedは一貫して高速になります。ちなみに、クラスMyUselessClassのサイズも時間の比率に影響します。

    +0

    さて、あなたはおそらく、私がループについて言及しなかったので、私を落胆させました。 make_sharedは1000000回ループした後でも "share"よりも遅いです。 OPがmake_sharedが "share"よりも遅いことを観測したのは、最適化レベルが理由だと私は本当に信じています。 – wood

    関連する問題