mpi*_*pe3 9 c++ boost smart-pointers shared-ptr visual-c++
有没有人在发布模式版本中测试过这个?或者实现如此相似,没有显着差异?
我对速度感兴趣:
创建一个新的shared_ptr
创建shared_ptr的副本
取消引用指针以访问指针对象
这将是针对速度优化的发布版本,使用make_shared()创建新的shared_ptrs
好的,所以看起来没有人这样做过.以下是我使用WIN32控制台应用程序的标准VC 10优化设置找到的内容:
当填充1000万个指针条目的向量时,Visual C++ 2010 SP1 std :: make_shared和std :: shared_ptr比Boost 1.46.1当量更快(1.96秒与20次运行中平均0.92秒)
复制1000万个指针条目的数组时,Boost 1.46.1比Visual C++ 2010 SP1快一点(0.15秒对比20次运行平均0.17秒)
当取消引用1000万个指针条目的向量20次时,Visual C++ 2010 SP1略高于Boost 1.46.1当量(0.72秒,而20次运行平均为0.811秒)
结论:创建shared_ptrs以填充向量时存在显着差异.与Boost 1.46.1相比,Visual C++ 2010 shared_ptr几乎快了两倍,表明实现上有很大差异.
其他测试没有显示出显着差异.
这是我使用的代码:
#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;
}
Run Code Online (Sandbox Code Playgroud)
我会等一会儿,如果没有人反驳我的结果或得出更好的结论,我会接受我自己的答案.