gpt4 book ai didi

c++ - 在 Visual C++ 2010 上哪个更快 - std::shared_ptr 或 boost::shared_ptr?

转载 作者:可可西里 更新时间:2023-11-01 16:36:34 25 4
gpt4 key购买 nike

有没有人在 Release模式构建中测试过这个?还是实现如此相似而没有显着差异?

我对速度感兴趣:

  1. 创建一个新的 shared_ptr

  2. 创建 shared_ptr 的拷贝

  3. 取消引用指针以访问指针对象

这将在一个针对速度优化的发布版本中,使用 make_shared() 创建新的 shared_ptr

最佳答案

好的,看来没有人这样做过。以下是我使用 WIN32 控制台应用程序的标准 VC 10 优化设置发现的内容:

  1. Visual C++ 2010 SP1 std::make_shared 和 std::shared_ptr 在填充包含 1000 万个指针条目的 vector 时比等效的 Boost 1.46.1 更快(1.96 秒对 20 次运行的平均 0.92 秒)

  2. 在复制包含 1000 万个指针条目的数组时,Boost 1.46.1 比 Visual C++ 2010 SP1 稍快(20 次运行平均为 0.15 秒对 0.17 秒)

  3. Visual C++ 2010 SP1 比 Boost 1.46.1 等效版本稍微快一点,当取消引用包含 1000 万个指针条目的 vector 20 次时(0.72 秒对 0.811 秒,运行 20 次平均)

结论:在创建 shared_ptr 来填充 vector 时存在显着差异。 Visual C++ 2010 shared_ptr 的速度几乎是 Boost 1.46.1 的两倍,这表明与 Boost 1.46.1 相比在实现上存在显着差异。

其他测试没有显示出显着差异。

这是我使用的代码:

#include "stdafx.h"

struct A
{
A( const unsigned A) : m_value(A)
{
}

const unsigned m_value;
};

typedef std::shared_ptr<A> APtr;
typedef boost::shared_ptr<A> ABoostPtr;


double TestSTLCreateSpeed()
{
const unsigned NUM_ENTRIES = 10000000;
std::vector<APtr> buffer;
buffer.reserve(NUM_ENTRIES);

boost::timer timer;

for( unsigned nEntry = 0; nEntry < NUM_ENTRIES; ++nEntry)
{
buffer.emplace_back( std::make_shared<A>(nEntry) );
}

const double timeTaken = timer.elapsed();

std::cout << "STL create test took " << timeTaken << " secs.\r\n";
return timeTaken;
}

double BoostSTLCreateSpeed()
{
const unsigned NUM_ENTRIES = 10000000;
std::vector<ABoostPtr> buffer;
buffer.reserve(NUM_ENTRIES);

boost::timer timer;

for( unsigned nEntry = 0; nEntry < NUM_ENTRIES; ++nEntry)
{
buffer.emplace_back( boost::make_shared<A>(nEntry) );
}

const double timeTaken = timer.elapsed();

std::cout << "BOOST create test took " << timeTaken << " secs.\r\n";
return timeTaken;
}

double TestSTLCopySpeed()
{
const unsigned NUM_ENTRIES = 10000000;
std::vector<APtr> buffer;
buffer.reserve(NUM_ENTRIES);

for( unsigned nEntry = 0; nEntry < NUM_ENTRIES; ++nEntry)
{
buffer.emplace_back( std::make_shared<A>(nEntry) );
}

boost::timer timer;
std::vector<APtr> buffer2 = buffer;

const double timeTaken = timer.elapsed();

std::cout << "STL copy test took " << timeTaken << " secs.\r\n";
return timeTaken;
}

double TestBoostCopySpeed()
{
const unsigned NUM_ENTRIES = 10000000;
std::vector<ABoostPtr> buffer;
buffer.reserve(NUM_ENTRIES);

for( unsigned nEntry = 0; nEntry < NUM_ENTRIES; ++nEntry)
{
buffer.emplace_back( boost::make_shared<A>(nEntry) );
}

boost::timer timer;
std::vector<ABoostPtr> buffer2 = buffer;

const double timeTaken = timer.elapsed();

std::cout << "BOOST copy test took " << timeTaken << " secs.\r\n";
return timeTaken;
}

double TestBoostDerefSpeed()
{
const unsigned NUM_ENTRIES = 10000000;
std::vector<ABoostPtr> buffer;
buffer.reserve(NUM_ENTRIES);

for( unsigned nEntry = 0; nEntry < NUM_ENTRIES; ++nEntry)
{
buffer.emplace_back( boost::make_shared<A>(nEntry) );
}

boost::timer timer;

unsigned total = 0;

for(unsigned nIter = 0; nIter < 20; ++nIter)
{
std::for_each( buffer.begin(), buffer.end(),
[&](const ABoostPtr& pA){
total += pA->m_value;
});
}

const double timeTaken = timer.elapsed();

std::cout << "BOOST deref total = " << total << ".\r\n";

std::cout << "BOOST deref test took " << timeTaken << " secs.\r\n";
return timeTaken;
}

double TestSTLDerefSpeed()
{
const unsigned NUM_ENTRIES = 10000000;
std::vector<APtr> buffer;
buffer.reserve(NUM_ENTRIES);

for( unsigned nEntry = 0; nEntry < NUM_ENTRIES; ++nEntry)
{
buffer.emplace_back( std::make_shared<A>(nEntry) );
}

boost::timer timer;

unsigned total = 0;
for(unsigned nIter = 0; nIter < 20; ++nIter)
{
std::for_each( buffer.begin(), buffer.end(),
[&](const APtr& pA){
total += pA->m_value;
});
}

const double timeTaken = timer.elapsed();

std::cout << "STL deref total = " << total << ".\r\n";

std::cout << "STL deref test took " << timeTaken << " secs.\r\n";
return timeTaken;
}

int _tmain(int argc, _TCHAR* argv[])
{
double totalTime = 0.0;
const unsigned NUM_TESTS = 20;

totalTime = 0.0;

for ( unsigned nTest = 0; nTest < NUM_TESTS; ++nTest)
{
totalTime += BoostSTLCreateSpeed();
}

std::cout << "BOOST create test took " << totalTime / NUM_TESTS << " secs average.\r\n";

totalTime = 0.0;
for ( unsigned nTest = 0; nTest < NUM_TESTS; ++nTest)
{
totalTime += TestSTLCreateSpeed();
}

std::cout << "STL create test took " << totalTime / NUM_TESTS << " secs average.\r\n";


totalTime = 0.0;
for ( unsigned nTest = 0; nTest < NUM_TESTS; ++nTest)
{
totalTime += TestBoostCopySpeed();
}

std::cout << "BOOST copy test took " << totalTime / NUM_TESTS << " secs average.\r\n";

totalTime = 0.0;
for ( unsigned nTest = 0; nTest < NUM_TESTS; ++nTest)
{
totalTime += TestSTLCopySpeed();
}

std::cout << "STL copy test took " << totalTime / NUM_TESTS << " secs average.\r\n";

totalTime = 0.0;
for ( unsigned nTest = 0; nTest < NUM_TESTS; ++nTest)
{
totalTime += TestBoostDerefSpeed();
}

std::cout << "Boost deref test took " << totalTime / NUM_TESTS << " secs average.\r\n";

totalTime = 0.0;
for ( unsigned nTest = 0; nTest < NUM_TESTS; ++nTest)
{
totalTime += TestSTLDerefSpeed();
}

std::cout << "STL deref test took " << totalTime / NUM_TESTS << " secs average.\r\n";

return 0;
}

我会等一会儿,如果没有人反驳我的结果或得出更好的结论,我会接受我自己的回答。

关于c++ - 在 Visual C++ 2010 上哪个更快 - std::shared_ptr 或 boost::shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6471112/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com