C++ 如何对非常快的操作进行基准测试

标签 c++ floating-point benchmarking c++-chrono

我使用的是 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/

相关文章:

java - 使用 JMH 作为功能/用户级别性能测试的框架。这是错的吗?

C++、ANTLR 和 VECTORS

涉及 vector 的 C++ 代码在 visual studio 上运行良好,但在 linux 上运行不佳

C++ 虚拟方法 : Must I create a virtual method in the parent class for every method that the child and parent do not share?

c++ - 浮点值可以加到零之和吗?

c - 一个 C 程序崩溃,使用 double 类型可变长度数组

database - 大型公共(public)数据集?

c++ - 设置 Netbeans 8.0.2 以与 Qt 5.4 一起使用

c++ - 警告不精确的浮点常量

c# - Java 与 C# : Are there any studies that compare their execution speed?