我正在编写一个简单的 C++ 基准测试,以比较不同平台上数据访问的执行时间。但是我得到了奇怪的结果。我测量了顺序访问和间接访问的时间。为此,我只是以两种不同的方式将一个数组的数据复制到另一个数组中。下面是代码和结果。
我得到的时间是模棱两可的。对于 int 数据类型的评估显示,顺序访问更快(这很好)。但是对于 float 和 double 类型,情况恰恰相反(请参见下面的时间结果)。也许我在做基准测试时出了问题,或者有一些陷阱我没有考虑到吗?还是您可以建议一些基准测试工具来比较不同数据类型的数据访问或简单操作性能呢?
template<typename T>
std::chrono::nanoseconds::rep PerformanceMeter<T>::testDataAccessArr()
{
std::chrono::nanoseconds::rep totalSequential = 0;
T* arrDataIn = new T[k_SIZE];
T* arrDataOut = new T[k_SIZE];
std::generate_n(arrDataIn, k_SIZE, DataProcess<T>::valueGenerator);
DataProcess<T>::clearCache();
std::chrono::nanoseconds::rep timeSequential = measure::ns(copySequentialArr, arrDataIn, arrDataOut, k_SIZE);
std::cout << "Sequential order access:\t" << timePrint(timeSequential) << "\t";
std::cout.flush();
std::chrono::nanoseconds::rep totalIndirection = 0;
T** pointers = new T*[k_SIZE];
T** pointersOut = new T*[k_SIZE];
for (size_t i = 0; i < k_SIZE; ++i)
{
pointers[i] = &arrDataIn[i];
pointersOut[i] = &arrDataOut[i];
}
std::generate_n(arrDataIn, k_SIZE, DataProcess<T>::valueGenerator);
std::generate_n(arrDataOut, k_SIZE, DataProcess<T>::valueGenerator);
DataProcess<T>::clearCache();
totalIndirection = measure::ns(copyIndirectionArr, pointers, pointersOut, k_SIZE);
std::cout << std::endl << "Indirection order access:\t" << timePrint(totalIndirection) << std::endl;
std::cout.flush();
delete[] arrDataIn;
delete[] arrDataOut;
delete[] pointers;
delete[] pointersOut;
return timeSequential;
}
template <typename T>
void PerformanceMeter<T>::copySequentialArr(const T* dataIn, T* dataOut, size_t dataSize)
{
for (int i = 0; i < dataSize; i++)
dataOut[i] = dataIn[i];
}
template <typename T>
void PerformanceMeter<T>::copyIndirectionArr(T** dataIn, T** dataOut, size_t dataSize)
{
for (int i = 0; i < dataSize; i++)
*dataOut[i] = *dataIn[i];
}
结果:
-------------------测量int---------------
数据:10 MB;迭代次数:1
顺序访问:8.50454毫秒
间接访问:11.6925毫秒
-------------------测量float------------
数据:10 MB;迭代次数:1
顺序访问:8.84023毫秒
间接访问:8.53148毫秒
-------------------测量double-----------
数据:10 MB;迭代次数:1
顺序访问:5.57747毫秒
间接访问:3.72843毫秒