当我们测量C ++标准memcpy函数(Visual Studio 2015)的性能时,我们观察到的差别取决于要复制的对象是从全局(在main()函数之外)还是在堆上分配的? 。对于全局对象,性能似乎更好。对此有何解释?
对于性能测试,我使用了chrono库。
我的测试函数(nTest = 5,nOp = 100.000,mySourceArray和myDestArray是char数组,arraySize = 1.000.000):
void std_memcpy_aligned(std::string testDescr, int nTest, int nOp, char mySourceArray[], char myDestArray[],const int arraySize)
{
std::cout << "Performance test: " << testDescr << '\n' << "number of operations/run: " << nOp << '\n';
for (int i = 0; i < nTest; ++i) {
//Measure performance
auto begin = std::chrono::high_resolution_clock::now(); //start time
for (int ii = 0; ii < nOp; ++ii) {
memcpy(myDestArray, mySourceArray, arraySize);//aligned source and aligned target address
}
auto end = std::chrono::high_resolution_clock::now(); //end time
std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(end - begin).count() << "ms" << '\n';
}
}
使用全局对象与堆上对象的测试之间的差异大约为5%。
详细说明:n = 10次测试运行,“堆积”测试:8513 ms +/- 114 ms(平均值+/- sd),“全局”测试:8113 ms +/- 52 ms(平均值+/- sd),结果很高 具有统计学意义