【问题标题】:how to properly write a benchmark program under release mode?如何在发布模式下正确编写基准程序?
【发布时间】:2014-02-01 09:30:31
【问题描述】:

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

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

有什么想法吗?

【问题讨论】:

  • 保持原样。如果您要进行基准测试,那是因为您需要真实的测量结果。和编译器优化是其中的一部分。
  • @H2CO3 这并不完全正确。 3DMark 曾经在 CPU 上进行渲染测试,这与实际测量相去甚远。基准测试的目标是测量(通常)硬件之间的性能比。即使测试非常不切实际,只要您一直使用相同的测试,您仍然可以比较硬件。
  • @Kevin 但如果不同的硬件以不同的比率处理易失性与非易失性,并且您不需要易失性,您的结果会出现偏差

标签: c++ c optimization compiler-construction profile


【解决方案1】:

通常,通过静态/易失性限定符添加“一些“外部依赖””会改变实际行为,因此不建议使用时间。

我通常确保可以测试代码的方法是使用argc(主参数的第一个参数) 如果我需要循环,我使用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;

【讨论】:

    猜你喜欢
    • 2016-03-08
    相关资源
    最近更新 更多