我对我对 make_shared 性能(boost 或 stl)的理解有点怀疑,所以我想要一些意见。
在使用 C++ 开发应用程序时,我必须进行一些性能测试,最后我比较了 make_shared 和 shared_ptr+new (请注意,这不是提高性能的目的,我不希望在这里获得时间,但我现在只是好奇)
我用
- Debian 杰西 x64
- liboost 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 更好性能的解释?
- 也许我在测试中错过了一些(几个)点?
如果您对以下几点有一些答案,请不要犹豫:)
谢谢