2016-04-07 12 views
3

どちらが速く評価されますか?私はjava構文を使用していますが、どのプログラミング言語も質問に適用されます。whileループの最速メソッド

while (1==1) { 

} 

while (true) { 

} 

これを大きなループでテストしようとしました。結果はあまりにも多岐にわたり、私にはっきりとした答えを与えてくれました。

+2

レッスンを覚えています:「結果はあまりにも多岐にわたり、私に確かな答えを与えてくれました。このようなマイクロ最適化は、しばしば測定不能な影響を及ぼす。 (状況は状況によって異なる場合があります) –

+0

一般的な答えはありません - 言語によって異なります。 – assylias

答えて

2

あなたがしようとしているのは「マイクロ最適化」です。それはそれだけの価値はありません。まともなコンパイラは、1 == 1は明らかに真と同じなので、同じコードを生成します。たとえそれが異なったコードであったとしても、少しの変化だけでは大きな違いはありません。

+0

あなたは、言語がコンパイルされていると仮定します。 - 解釈された言語の場合、それは差異を生じる可能性があります(私は非常に重大であるとは思われますが)。 – assylias

1

@gnasher729's answerはJavaにとってまったく正しいですが、ここでは自分で見つけ出す方法を示します。

次のクラスファイルを参照してください:あなたはf.ex.にこれを保存する場合は

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))); 
      } 
     } 
    } 
} 

SoOne.javaを入力し、while (true)に変更し、SoTrue.javaという名前で保存し、両方をjavac SoOne.java SoTrue.javaでコンパイルすると、クラスファイルが取得されます。これらの違いは

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(); 

ているので、コンパイラは実際に両方のチェックを削除し

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

を経由して分解することができます。最適化する時期については、https://en.wikipedia.org/wiki/Program_optimization#When_to_optimizeも参照してください。