2014-06-15 22 views
5

İşlemin karmaşıklığını belirtmek için JMH yöntemlerini kullanır. Eğer JMH ile hiç çalışmadıysanız endişelenmeyin. JMH, estimateOperation yöntemini birden çok kez başlatır ve ortalama süreyi alır.java önbellekleri, yöntemlerin sonuçlarını

Soru: [dar] bu program Math.cbrt(Integer.MAX_VALUE) her zaman hesaplar? Ya da sadece bir kez hesaplar ve daha sonra önbelleğe alınan sonucu döndürür?

@GenerateMicroBenchmark 
public void estimateOperation() { 
    calculate(); 
} 

public int calculate() { 
    return Math.cbrt(Integer.MAX_VALUE); 
} 

Soru: [geniş]: mu JVM hiç yöntemlerin sonucunu önbelleğe?

+0

Hesaplama() 'nerededir? – shmosel

cevap

8

yöntem dönüş tarafından bu sihirli numarayı değiştirmek değer hiçbir zaman önbelleğe alınmış. Ancak gereksiz ürün aramalar nedeniylesabit katlama, sürekli yayılma, ölü kodu ortadan kaldırılması, döngü değişkeni Kaldırma, yöntem inlining gibi vb belirli optimizasyonları çalıştırma süresi içinde tam zamanında derleyici tarafından ortadan kalkabilir Eğer Math.sqrt veya Math.pow ile Math.cbrt değiştirirseniz çağrı sabit ile değiştirilecektir çünkü. Örneğin

, yöntem, sonuçta JIT derleme de denilen edilmeyecektir. (Optimizasyon, cbrt için işe yaramıyor, çünkü bu nadir bir yöntemdir ve JVM tarafından oluşturulmamış bir yerel çağrının başına gelir).

+0

JIT optimizasyonları ile yaptığınız şeyi takip ettiğimden emin değilim.sqrt() 'ayrıca yerel bir çağrısına (en azından baktığım koddan) temsilcilerdir ve JIT derleyicisinin neden aynı şekilde Math.cbrt() işlevini de optimize edemediğini anlamıyorum. Math.sqrt() 'olarak - her iki durumda da aynı teknik çalışmalıdır. – awksp

+0

@ user3580294 Bu çağrılar JVM'ye bağlı olarak optimize edilebilir veya olmayabilir. Eğer HotSpot (OpenJDK ve Oracle JDK'da bulunan en popüler JVM) hakkında konuşursak, Math.sqrt en iyi duruma getirilecektir, çünkü bu [JVM intrinsic] (http://en.wikipedia.org/wiki/Intrinsic_function) Yani, JIT derleyicisi bir yöntem gibi davranmaz, ancak çağrıyı çevrim içi değerlendirme koduyla değiştirir. 'Math.cbrt' olsa da bir HotSpot intrinsic değil - sadece onun nadirliği ve ilgili CPU komutunun eksikliği nedeniyle yapılmadı. – apangin

+0

Ah, anlıyorum. Bu mantıklı. Bazı arama yapmak var gibi görünüyor ... – awksp

1

sayılı

Basitçe söylemek gerekirse, Java yöntemleri her zaman farklı değerler döndürebilir beri, önbelleğe yöntemi sonuçlarını yapar.

2

Evet o

public int calculate() { 
    return Math.cbrt(Integer.MAX_VALUE); 
} 


public double calculate(); 
    Code: 
     0: ldc2_w  #3     // double 2.147483647E9d 
     3: invokestatic #5     // Method java/lang/Math.cbrt:(D)D 
     6: dreturn  

önbelleğe sahip üzere çağrıldığı kod her şey çağıracağı, basitçe

özel statik nihai alanda

private static final double NUMBER = Math.cbrt(Integer.MAX_VALUE); 
+1

Bayt kodu hiçbir şeyi açıklamıyor. Örneğin. 'cbrt'' sqrt' ile değiştirin ve yöntem her seferinde çağrılmayacak. Cevap, çağrılan yönteme ve çevreye göre değişir. JIT optimizasyonları ([inlining] (http://en.wikipedia.org/wiki/Inline_expansion) + [sabit katlama] (http://en.wikipedia.org/wiki/Constant_folding) + [intrinsics] (http: // en.wikipedia.org/wiki/Intrinsic_function)), çağrının elenmesi ve bir sabit ile değiştirilmesiyle sonuçlanabilir. – apangin

+0

@apangin, cevabınızı yollayabilir misiniz? –

+0

@V_B Elbette. Genişletilmiş bir cevap eklendi. – apangin

1

Dar soruya cevap verin: JVM uygulamasına ve kodun nasıl yorumlandığına bağlıdır.

Geniş soruyu yanıtlayın: Hayır, çünkü Anubian'ın da belirttiği gibi, yöntemler her çağrıda farklı değerler döndürebilir.

İlgili konular