在我的测试中,make_shared(boost或stl)似乎比shared_ptr + new略慢

时间:2016-07-12 15:33:32

标签: c++ boost stl make-shared

我对make_shared performance(boost或stl)的理解有点怀疑,所以我想要一些意见。

在C ++中使用应用程序我必须进行一些性能测试,最后我将make_shared和shared_ptr + new进行比较(请注意,这不是性能改进的目的,我并不期待在这里获得时间,但我现在只是好奇)

我用

  • Debian Jessy 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),只有构造函数和析构函数。

&#34;结果&#34; (我引用,因为它当然不是一个准确的测试)是以下(我把它运行到循环中以获得许多迭代,平均给出相同的结果):

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

如果我相信我的测试,make_shared比调用share_ptr&amp;新的实现。我原以为,如果我看到任何差异为纳秒精度,则相反......

所以现在我想知道:

  • 也许我的测试太愚蠢了,nanosecons命令在那些操作中没有重要性?
  • 也许我在解释make_shared更好的表现方面错过了一点?
  • 也许我错过了测试中的一些(几个)点?

如果您对以下几点有一些答案,请不要犹豫:)

感谢名单

1 个答案:

答案 0 :(得分:1)

尝试使用-O2编译您的程序。我尝试编译你的代码而没有优化,我得到了类似的数字。之后,使用-O2编译代码,make_shared始终更快。顺便说一下,班级MyUselessClass的大小也会影响时间的比例。