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 のパフォーマンスが向上するという説明のポイントを見逃したのではないでしょうか?
- 多分私はテストでいくつかの(いくつかの)ポイントを逃しましたか?
以下の点についていくつかの答えがある場合は、躊躇しないでください:)
ありがとう