如果您有一个变量A,永远不会变化并始终等于零,函数F,函数G和函数H,并在现代英特尔台式机处理器上调用以下代码在现代版本的GCC上-O3优化:无法解释C++性能
for(i = 0; i < a_big_number; i++)
{
if(A != 0) F();
else G();
}
需要2秒钟执行。注意F永远不会被调用,因为A总是0.或者,
for(i = 0; i < a_big_number; i++)
{
if(A != 0) H();
else G();
}
只需要1秒钟执行。再次,A总是0,而H从来不被调用。最后,
for(i = 0; i < a_big_number; i++)
{
G();
}
只需要0.5秒执行。
鉴于前两个例子中的条件陈述,为什么F和H的内容是什么?既然他们从来没有被调用过,为什么它们会影响他们的工作?鉴于英特尔处理器具有复杂的分支预测,处理器不应该知道G()总是被调用,甚至不会浪费时间在条件语句上?我明白有条件的教学应该浪费一些时间,但我不明白为什么浪费那么多时间。
请提供一个完整,简单,可编译的独立示例,演示相对性能。 (另外,请注意,几秒或更短时间内运行的基准很可能会产生非常嘈杂的结果,并且请注意,找出性能差异的原因的最佳方法通常是查看生成的程序集。 ) – 2012-04-17 20:55:09
为什么比较语句需要零时间?如果GCC没有足够的信息对其进行优化,则需要执行CPU周期。 – dasblinkenlight 2012-04-17 20:56:34
F,G或H中的任何一个是否声明为“inline”?是一个声明的'const'?这三个代码片段是否出现在一个'main'中?关于后者:缓存可能解释一些性能差异;尝试重新排序三个代码块。 – 2012-04-17 20:58:22