2012-01-11 7 views
6

boş gövdeli bir döngü, bu şuna benzer:Garip yöntemi ile karşılaştık çok eski projede hata düzeltme sırasında Java

void waiter() { 
     for (int i = 0; i < 20000; i++) ; 
    } 

biraz zaman durdurma nedeni o mu yoksa tarafından ihmal edilecek JVM optimizasyonu?

+1

Neden yo ait ... koduna böyle bir parça yazmak uever ki? –

+0

Benim değil, bu projeyle çalışmaya başladım ...: D –

+0

Programın yürütülmesini duraklatmak için bu mantığı kullanıyor. ;) –

cevap

2

En iyi duruma getirilmiş olabilir, olmayabilir. Derleyicideki optimizasyon seviyesine bağlıdır.

i değişkeni döngüye kadar genişletilmiş, bu nedenle sonra kullanılabilir olmayacaktır. Derleyici, döngüün bilinen bir sayıyı çalıştıracağını statik olarak tanımlayabilir. Aynı zamanda boş deyimin birçok kez tekrarlandığını bilir. Daha sonra bir dizi boş ifadeyi bir boş bildirime veya hiç bir ifade haline dönüştürebilir. Bu, kodu tamamen sözdizimi ağacından kaldırmanın etkisine sahiptir.

Bu, bazı optimizasyon ayarları ve derleyicileri altında ve başkalarının altında olmayacaktır.

+0

Bazı belgelerle yedekleyebilir misiniz? "Optimize" ile "silindi" mi demek istiyorsun? Derleyicinin bir parça kodu atlatması garip görünüyor. –

+0

@ ŁukaszBachman Optimal durum, bu kodu ve i 20000 ayarını atlıyor. – holgac

+0

Bu bile değil, çünkü 'i ', döngüde belirlendi! – Joe

1

Değişti mi bilmiyorum, 2 yıldır java kullanmadım ama görünmüyor.

http://www.herongyang.com/JVM/Benchmark-Int-Empty-Loop-16-Nanosecond.html http://www.herongyang.com/JVM/Benchmark-Long-Empty-Loop-25-Nanosecond.html

Bu test aynı zamanda Java bytecode derleyici "Javac" olduğunu doğrulamaktadır , boş döngüyü, döngüün net etkisi olan "i = steps" ile değiştirmek için herhangi bir optimizasyon yapmaz.

+0

javac yapmadı, yapmaz ve hiçbir zaman ilginç optimizasyon yapmaz. Ve bağlantı, çevirme-puan testlerinden birini gösterir. Sayaç değerini ayarladığınızdan bağımsız olarak, aynı sonucu elde edersiniz: Çeviricideki ~ 10k kez döngüyü çalıştırırsanız, JIT ne kadar büyüklükte olursa olsun geri kalan döngüyü alır ve çıkarır. Bu durumda, amaçlanan sonuç gibi görünüyor. – Voo

0

Evet, optimised.I've çalıştı olacaktır: D Bu JIT birkaç koşular sonrasında optimize edilecek

+0

Hangi derleyici/ayar ile? –