作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我使用的是 VC++2013、Windows 7-64、Intel i7 3.6 GHz。我想测量非常快的数学运算的执行时间,例如我想比较标准 fabsf()
的性能使用替代的“更快”方法或标准 tanh()
函数与 Pade 近似等。
问题是这些操作太快了,即使我运行它们无数次,我在基准测试结束和开始之间的时间总是 0 毫秒。
我尝试使用 <chrono>
获取以纳秒为单位的时间但它四舍五入到十分之一毫秒,而不是真正的纳秒,所以我在基准测试中仍然得到 0 个经过的纳秒。
能否请您提供一段我可以用来运行基准测试的代码?
这是我的:
#include <vector>
#include <chrono>
#include <ctime>
using namespace std;
// 1/RAND_MAX
#define RAND_MAX_RECIP 0.00003051757f
int _tmain(int argc, _TCHAR* argv[])
{
srand (static_cast <unsigned> (time(0)));
// Fill a buffer with random float numbers
vector<float> buffer;
for (unsigned long i=0; i<10000000; ++i)
buffer.push_back( (float)rand() * RAND_MAX_RECIP );
// Get start time
auto start = std::chrono::high_resolution_clock::now();
for (unsigned long i=0; i<buffer.size(); ++i)
{
// do something with the float numbers in the buffer
}
// Get elapsed time
auto finish = std::chrono::high_resolution_clock::now();
printf("Executed in %d ns\n\n", std::chrono::duration_cast<std::chrono::nanoseconds>(finish-start).count());
return 0;
}
最佳答案
我认为最有可能的问题是编译器注意到您没有使用计算结果并优化了计算。您只需要说服编译器不要那样做。
我建议只保留所有计算结果的运行总和,并在打印循环所用时间后将其打印出来。您将忽略最后的总和,但编译器不会知道。
关于C++ 如何对非常快的操作进行基准测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095601/
我是一名优秀的程序员,十分优秀!