どちらが速く評価されますか?私はjava構文を使用していますが、どのプログラミング言語も質問に適用されます。whileループの最速メソッド
while (1==1) {
}
while (true) {
}
これを大きなループでテストしようとしました。結果はあまりにも多岐にわたり、私にはっきりとした答えを与えてくれました。
どちらが速く評価されますか?私はjava構文を使用していますが、どのプログラミング言語も質問に適用されます。whileループの最速メソッド
while (1==1) {
}
while (true) {
}
これを大きなループでテストしようとしました。結果はあまりにも多岐にわたり、私にはっきりとした答えを与えてくれました。
あなたがしようとしているのは「マイクロ最適化」です。それはそれだけの価値はありません。まともなコンパイラは、1 == 1は明らかに真と同じなので、同じコードを生成します。たとえそれが異なったコードであったとしても、少しの変化だけでは大きな違いはありません。
あなたは、言語がコンパイルされていると仮定します。 - 解釈された言語の場合、それは差異を生じる可能性があります(私は非常に重大であるとは思われますが)。 – assylias
@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も参照してください。
レッスンを覚えています:「結果はあまりにも多岐にわたり、私に確かな答えを与えてくれました。このようなマイクロ最適化は、しばしば測定不能な影響を及ぼす。 (状況は状況によって異なる場合があります) –
一般的な答えはありません - 言語によって異なります。 – assylias