2016-04-07 24 views
3

Daha hızlı bir şekilde değerlendirmek hangisi? Ben java sözdizimi kullanıyorum, ama soru için herhangi bir programlama dili geçerli olacaktır.Döngü en hızlı yöntem

while (1==1) { 

} 

while (true) { 

} 

Bunu büyük bir döngü ile denedim. Sonuçlar bana sağlam bir cevap vermek için çok fazla değişti.

+2

Dersi hatırla: "sonuçlar bana katı bir cevap vermek için çok fazla değişiklik gösterdi". Bu tür mikro optimizasyonlar genellikle ölçülemez bir etkiye sahiptir. (Davranışın koşullara bağlı olduğunu hesaba katmamak.) –

+0

Genel bir cevap yoktur - dile bağlıdır. – assylias

cevap

2

Yapmaya çalıştığınız şey bir "mikro optimizasyon" dur. Buna değmez. Herhangi bir iyi derleyici aynı kodu üretecektir, çünkü 1 == 1 açık olarak doğrudur. Farklı bir kod olsa bile, bu küçük bir değişim, ölçülebilir bir fark yaratmayacaktır.

+0

, dilin derlendiğini varsayarsınız - yorumlanmış bir dil için bir fark yaratabilir (materyal olma olasılığını kabul etmeme rağmen). – assylias

1

@gnasher729's answer, Java için tamamen haklıyken, işte size göre.

Aşağıdaki sınıf dosyasına bakın:

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

Eğer f.ex. bu kaydederseniz SoOne.java, satırı while (true) olarak değiştirin, SoTrue.java olarak kaydedin ve javac SoOne.java SoTrue.java aracılığıyla derleyin, sınıf dosyalarını alırsınız. Bunlar

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

aracılığıyla demonte edilebilir farklar

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

Yani derleyici gerçekten hem çekleri kaldırır vardır. En iyileştirme zamanı hakkında da ayrıca bkz. https://en.wikipedia.org/wiki/Program_optimization#When_to_optimize.