0

make_shared のパフォーマンス (boost または stl) について私が理解していることについて少し疑問があるので、意見を求めました。

C++ でアプリを作成する際にいくつかのパフォーマンス テストを行う必要があり、最終的に make_shared と shared_ptr+new を比較しました (これはパフォーマンス向上の目的ではないことに注意してください。ここで時間を稼ぐことは期待していませんが、ちょうど今興味がある)

私が使う

  • Debian ジェシー x64
  • リブースト1.55
  • gcc 4.9.2

私は 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 つのクラス属性 (sting、bool、int)、およびコンストラクターとデストラクターのみを持つ単純なクラスです。

「結果」(もちろん正確なテストではないので引用します)は次のとおりです(多くの反復を取得するためにループに実行し、平均して同じ結果が得られます):

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

私のテストを信じるなら、make_shared は、share_ptr と新しいインスタンス化を呼び出すよりもわずかに遅くなります。違いをナノ秒の精度で見るとしたら、逆に...

だから今私は疑問に思っています:

  • 多分私のテストはあまりにも愚かです.ナノ秒の順序はそれらの操作では重要ではありませんか?
  • make_shared のパフォーマンスが向上するという説明のポイントを見逃したのではないでしょうか?
  • 多分私はテストでいくつかの(いくつかの)ポイントを逃しましたか?

以下の点についていくつかの答えがある場合は、躊躇しないでください:)

ありがとう

4

1 に答える 1

1

でプログラムをコンパイルしてみてください-O2。最適化なしでコードをコンパイルしようとしましたが、同様の数値が得られました。コードを でコンパイルした後、-O2make_shared は一貫して高速です。ちなみに、クラスの大きさMyUselessClassも時間の比率に影響します。

于 2016-11-23T07:26:49.933 に答える