JVM: JIT ve Interpretation Modlarının Performans Karşılaştırması
JVM (Java Sanal Makinesi) üreticileri, bytecode değerlendirmesi için çeşitli teknikler uygulamaktadır. Bu teknikler genel olarak Pure bytecode interpretation, Static compilation, Total JIT compilation ve Mixed mode interpretation 'dir. Eğer bu kavramlara aşinalığınız henüz bulunmuyorsa, https://kodedu.com/2012/06/jvm-kod-uretme-yaklasimlari/ yazısını okumanızı önermekteyiz.
Hotspot JVM ise bu bayt kod işleme tekniklerinden, Mixed mode interpretation tekniğini varsayılan olarak kullanmaktadır. Yani Hotspot JVM, yeri geldiğinde Interpretation(yorumlama), yeri geldiğinde ise JIT compilation (derleme) ile maksimum performans ve maksimum platform bağımsızlığı elde etmeyi amaçlamaktadır.
Peki varsayılan Mixed mode interpretation (JIT + Interpreted mod) tekniği ile Pure bytecode interpretation tekniğinin performans karşılaştırmasını hiç merak ettiniz mi?
Bu kıyaslamayı yapabilmek için Hotspot JVM üzerinde varsayılan olarak koşturulan JIT derleyici özelliğini kapatabiliriz.
DEMO
XintApp sınıfı, "kodedu.com " ifadesini, bir StringBuffer nesnesine döngüsel olarak sürekli eklemektedir. Ekleme işlemini 10'ar kez ve Integer tipinin azami değerinin 1/50 kadarı boyunca eklemektedir. Buradaki maksadımız aslında belirli bir süre tüketen basit bir uygulama oluşturmak.
public class XintApp {
public static void main(String[] args) {
long start = System.currentTimeMillis();
StringBuffer buffer = new StringBuffer();
for (int j = 0; j < 10; j++) {
for (int i = 0; i < (Integer.MAX_VALUE / 50); i++) {
buffer.append("kodedu.com ");
}
buffer = new StringBuffer();
}
long end = System.currentTimeMillis();
System.out.format("Süre: %d %n", (end - start));
}
}
XintApp uygulaması çalıştırıldığında, toplam koşum süresi milisaniye cinsinden çıktılanacaktır.
Şimdi bu uygulamayı normal bir biçimde derleyelim ve koşturalım. Uygulama biraz bellek tükettiği için -Xmx4g parametresi ile azami Heap boyutu 4GB olarak ayarlanmaktadır. Bu değerleri kendi çalıştırma ortamında yeniden düzenleyebilirsiniz.
$ javac XintApp.java
$ java -Xmx4g XintApp
// Süre: 15615
Görüldüğü üzere, JIT + Interpreted mod ile yaklaşık 16 saniyede uygulama koşumu tamamlandı. Peki şimdi, JIT devredışı bırakalım ve ne kadar sürede koştuğuna bakalım. JIT derleyiciyi devredışı bırakmak için, -Xint JVM parametresini kullanmalıyız.
$ javac XintApp.java
$ java -Xmx4g -Xint XintApp
// Süre: 112858
JIT derleyici devredışı bırakıldığında yani sadece interpreted mod ile uygulama koşumu yaklaşık 2 dakika sürdü. Buradan aradaki farkın XintApp uygulaması için yaklaşık 7 kat olduğunu görebilmekteyiz.
Eğer JIT derleyicinin aktivitelerini süre bazında görmek istiyorsak -XX:+PrintCompilation JVM parametresini komut satırına ekleyebiliriz.
$ javac XintApp.java
$ java -Xmx4g -XX:+PrintCompilation XintApp
// ------
60 1 3 java.lang.Object::<init> (1 bytes)
61 2 3 java.lang.String::length (6 bytes)
61 3 3 java.lang.String::charAt (29 bytes)
61 4 3 java.lang.String::equals (81 bytes)
62 5 1 java.lang.ref.Reference::get (5 bytes)
63 6 3 java.lang.String::indexOf (70 bytes)
...
Süre: 15615
Tekrar görüşmek dileğiyle..
1 Comment