c++ - 如何在 Release模式下正确编写基准程序?

标签 c++ c optimization compiler-construction profile

在运行一些基准程序时,挂钟可能会给出非常短的持续时间,这是因为各种编译器优化,如死代码消除、循环展开......优化了测试代码。

我可能会通过 static/volatile 限定符添加一些“外部依赖”,但这并不总是有效。

有什么想法吗?

最佳答案

通常,添加“通过静态/ volatile 限定符的一些‘外部依赖’”会改变实际行为,因此不建议在时机上这样做。

我通常确保代码可以测试的方法是使用 argc(main 的第一个 arg) 如果我需要循环,我会使用 argc 更改输入数据。还有一些虚拟计算值取决于代码并在循环和计时器之后打印,以确保结果不会被优化掉。

如果您的填充函数可以使用种子,您也可以只使用 argc 作为种子的一部分。

因此,如果您有随机测试数据,或用于测试代码的循环,请向其中添加 argc

在不知道你在测试什么的情况下,我能做的最好的就是

seed=argc;        // the compiler cannot count on any value of argc
dummy=0;
total_time=0;
for (rep=0; rep < max_rep; ++rep)
{
    for (i =0; i < max_array; ++i)
    {
         test_array[i]=seed+gen_random();  // Note use of seed
    }

    start=time_now();
    dummy+=function_to_time(test_array);  // this is what you are testing
    end=time_now();
    total_time+=end-start;
    seed++;                               // change seed just to be extra paranoid
}
std::cout << "Time=" << total_time << "  Dummy=" << dummy << std::endl;

关于c++ - 如何在 Release模式下正确编写基准程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21094632/

相关文章:

c - 用罗马数字表示年份

c++ - 获取App路径,末尾不带应用名称

mysql - 优化mysql where、group by、扫描过多行

c++ - 在 C++ 中,除法比乘法更昂贵吗?

mysql - 有关如何优化此 MySQL 查询以更快运行的建议

c++ - 在 XCode 中桥接 C++ 和 Swift,正确的build设置是什么?

c++ - 不同编译器的枚举大小(以字节为单位)

c++ - 重载赋值运算符而不使用=

c++ - 如何在不使用中间变量的情况下初始化包含数组的 constexpr 结构?

C 指向数组的指针示例停止工作