【发布时间】:2014-06-27 16:39:35
【问题描述】:
这是 C++ 的一般效率问题。我不熟悉编译器的内部工作原理,所以假设我有几个循环和一个潜在的 if 语句,例如:
for(int i=0; ...)
{
for(int j=0; ...)
{
if( ... )
{
...
}
else
{
... (slightly different)
}
}
}
但是,这个 if 语句独立于循环。如果我改为在循环外部定义 if/else 语句并在内部循环,是否存在显着的速度差异?例如:
if( ... )
{
for(int i=0; ...)
{
for(int j=0; ...)
{
...
}
}
}
else
{
for(int i=0; ...)
{
for(int j=0; ...)
{
... (slightly different)
}
}
}
如果是这样,或者如果不是这样,为什么会这样?我有一些想法,编译器会识别一遍又一遍地执行相同的 if 语句,但这对我来说是非常陌生的领域。
我检查了对这个问题的回答: Would compiler optimize conditional statement in loop by moving it ouside the loop? 他讨论了 gcc 中不同级别的优化,以及 -O3(我认为)如何做到这一点。但是这样的事情会自动完成吗?如果不是,那么在循环中这样的 if 语句的成本有多大?
【问题讨论】:
-
即使您的编译器没有将您的代码优化为第二种形式,您的处理器的分支预测也应该能够以最小的开销轻松处理这个问题。
-
您可以将代码移动到两个函数中,然后在循环之前选择一个。
-
不完全相同,但相同的想法。这是一个视频,Lavavej 先生试图说服我们不要打扰编译器的工作。链接:Don’t Help the Compiler.
-
@Drop,我同意当性能不是主要考虑因素时,不应该过早地优化并尝试第二次猜测编译器。但是,当需要优化并且您需要更高的性能时,您应该坚决不信任编译器。您应该考虑所有选项。
标签: c++ performance compiler-construction