循环最快的方法

时间:2016-04-07 12:09:09

标签: time logical-operators

哪个评价更快?我正在使用java语法,但任何编程语言都适用于这个问题。

while (1==1) {

}

while (true) {

}

我尝试用大循环测试它。结果差异太大,无法给我一个可靠的答案。

2 个答案:

答案 0 :(得分:1)

您要做的是"微优化"。这不值得。任何体面的编译器都会生成相同的代码,因为1 == 1显然与true相同。即使它是不同的代码,这一点点改变也不会产生任何可衡量的差异。

答案 1 :(得分:0)

虽然@gnasher729's answer完全适合Java,但以下是如何自行查找。

请参阅以下类文件:

import java.util.Date;
public class SoOne {
    public static void main(String... args) {
        long counter = 1;
        long start = new Date().getTime();
        while ( 1 == 1 ) { // other class has while ( true )
            counter += 1;
            if ( counter % 1000000 == 0 ) {
                System.out.println("after: " 
                                   + ( new Date().getTime() - start )
                                   + ": " + counter
                                   + " per second: " 
                                   + ( counter
                                       / ( new Date().getTime() - start )));
            }
        }
    }
}

如果将此保存到f.ex. SoOne.java,将行更改为while (true),将其保存为SoTrue.java,然后通过javac SoOne.java SoTrue.java进行编译,即可获得类文件。这些可以通过

拆解
 javap -c SoOne.class  >so.javap
 javap -c SoTrue.class  >st.javap

差异是

 diff so.javap st.javap 
1,3c1,3
< Compiled from "SoOne.java"
< public class SoOne {
<   public SoOne();
---
> Compiled from "SoTrue.java"
> public class SoTrue {
>   public SoTrue();

因此编译器确实删除了两个检查。另请参阅https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize有关何时优化。