2010-10-28 76 views
17

考虑以下2种情况:循环时花费更多;分配还是if语句?

boolean b = false; 
int i = 0; 
while(i++ < 5) { 
    b = true; 
} 

OR

boolean b = false; 
int i = 0; 
while(i++ < 5) { 
    if(!b) { 
     b = true; 
    } 
} 

哪个更 “昂贵”,怎么办?如果答案取决于使用的语言/编译器,请提供。我的主要编程语言是Java。

请不要问我喜欢为什么要这样做的问题..他们只是指出相关的准系统示例:如果变量在循环中一次又一次地设置相同的值,或者应该是在每个需要更改值的环路上进行测试?

+2

可能重复的[如果Thens更快,然后乘法和赋值?](http://stackoverflow.com/questions/4024201/are-if-thens-faster-then-multiplication-and-assignment) – 2010-10-28 13:44:31

+0

如果我记得我的编译器类正确,由于http://en.wikipedia.org/wiki/Branch_predictor这些都将出现大致相同。我认为第一次需要多一点时间才能完成分支,但之后编译器可以进行预测并相应地进行调整。 – 2010-10-28 13:48:03

+0

在这里你会发现许多答案http://www.agner.org/optimize/optimizing_cpp.pdf – ruslik 2010-10-28 13:57:12

回答

1

您是否试图找出每个循环在总运行时间内执行分配的速度是否比检查每个循环更快,并且只对满足测试条件分配一次?

在上面的例子中,我猜想第一个更快。你执行5个任务。在后者中,您执行5测试,然后执行任务。

但是你需要增加迭代次数并且投入一些秒表定时器来确定。

0

任何编译器(除非,也许,在调试)将优化这两个语句

bool b = true; 

但一般来说,分配和分支的相对速度依赖于处理器架构,而不是在编译器。现代超级标量处理器在分支机构上表现可怕。每个指令使用一个简单的微控制器,其循环次数大致相同。

0

相对于您的准系统例如(或许你的实际应用):

boolean b = false; 
// .. other stuff, might change b 
int i = 0; 
// .. other stuff, might change i 
b |= i < 5; 
while(i++ < 5) { 
    // .. stuff with i, possibly stuff with b, but no assignment to b 
} 

问题是否解决?

但是真的 - 这将是您的测试成本(通常不只是if (boolean))和您的任务的成本(通常不只是primitive = x)的问题。如果测试/分配费用昂贵,或者您的循环足够长或者您有足够高的性能需求,则可能需要将其分为两部分 - 但所有这些标准都要求您测试执行情况。当然,如果您的要求更苛刻(例如,b可以来回翻转),您可能需要更复杂的解决方案。

3

你测试过了吗?在Linux系统上工作时,我将第一个示例放在一个名为LoopTestNoIf.java的文件中,第二个示例放在一个名为LoopTestWithIf.java的文件中,它们围绕每个文件包装一个主函数和类,并进行编译,然后使用此bash脚本运行:

#!/bin/bash 
function run_test { 
    iter=0 
    while [ $iter -lt 100 ] 
    do 
    java $1 
    let iter=iter+1 
    done 
} 
time run_test LoopTestNoIf 
time run_test LoopTestWithIf 

结果为:

real 0m10.358s 
user 0m4.349s 
sys  0m1.159s 

real 0m10.339s 
user 0m4.299s 
sys  0m1.178s 

显示的是具有使得如果我的系统上它稍微快。

+0

我得到了类似的结果,请看看我对安迪莱斯特的评论。 – heikkim 2010-11-01 12:02:36

27

请不要忘记rules of Optimization Club

  1. 优化俱乐部的第一条规则是,你不要优化。
  2. 优化俱乐部的第二条规则是,如果不进行测量,您不会进行优化。
  3. 如果您的应用运行速度比底层传输协议快,则优化结束。
  4. 一次一个因素。
  5. 没有marketroids,没有marketroid时间表。
  6. 只要需要,测试将继续进行。
  7. 如果这是您在Optimization Club的第一晚,您必须编写一个测试用例。

看来你已经违反规则2.你没有测量。如果你真的想知道,你可以通过设置一个测试来针对场景B运行场景A并找到答案,从而自己回答问题。不同环境之间有如此多的差异,我们无法回答。

+0

我没有优化。我的动机是好奇心。 我接受你的回答:“不同环境之间有太多的差异,我们无法回答。” – heikkim 2010-11-01 11:52:50

+0

我在Java上测试了这个循环100 000次,看起来这个测试非常简单,条件赋值略快。 – heikkim 2010-11-01 12:00:35