2012-11-17 27 views
6

Mikro nokta işaretlerini yazarken, bir yöntemin derlenmiş olup olmadığına bağlı olarak çalışma zamanında büyük bir farklılık gözlemlenebilir. Belirli bir yöntemin derlenmiş olup olmadığını bir program içinde anlatmanın bir yolu var mı? Alternatif olarak, talep edilmesi için bir yol var mı, veya örneğin, ör. bayraklar JVM'ye geçti? Açıkçası bu mutlaka mükemmel olmayacaktır (örneğin, JVM'nin yorumlanmış kodlara geri dönmesine neden olan bazı koşullar mevcut olabilir), fakat kesinlikle bir gelişme olacaktır.JVM içinde belirli bir yöntemin JIT derlenmiş olup olmadığını anlamanın bir yolu var mı?

+0

Yöntemin yürütme süresini ampirik olarak ölçebilir ve sonuçların dağılımını kontrol edebilirsiniz. Derlendiğinde genellikle bir sıçrama olacaktır. Bu metodoloji konusunda SO konusunda bir soru vardı ama şu an bulamıyorum. Açıkçası, bu biraz zorlayıcı. – assylias

+0

Neredeyse olumlu, cevabım "hayır, kesinlikle değil." –

+0

@assylias - Bu, yalnızca yöntemin önceden derlenmediğinden eminseniz çalışır. Aksi halde bulmak için zıplama yok. Ayrıca, sağlam değişim-algılama algoritmaları kodlama için bir acıdır. –

cevap

3

Sun/Oracle JVM için -XX:CompileThreshold=1000 ayarını kullanabilirsiniz.

Bu

- official documentation devlet olarak - tanımlar: metot çağrımı/dallar arasında

Numara Sonra

derlemeden önce, sadece JVM "ısınmak" için numarasını kullanabilirsiniz.

-XX:-PrintCompilation ile birlikte bir yöntem derlendiğinde (konsolda) bildirim almak için -XX:CompileThreshold ile birlikte kullanabilirsiniz.

+0

* "JVM'ye iletilen bayraklar hakkında herhangi bir ek bilgi olmadan" * ... – assylias

+0

JVM tarafından sayılan "dal" nedir? –

+0

@RexKerr - JVM, esas olarak, girdileri ve geriye doğru dalları (döngüleri gösteren) saymak suretiyle, yöntemde ne kadar zaman harcanacağını (ve dolayısıyla bunu derlemek için ne kadar avantaj olacağını) tahmin etmeye çalışır. Ama dahil olan başka faktörler de olabilir. –

1

Yöntemler JITCed olduğunda gösterilecek günlük kaydını açabileceğinizden eminim. Ama Java'nın içinden söyleyecek bir yol bilmiyorum.

Ayrıca, JIT derlemesinin bir olay değil, bir süreç olduğunu aklınızdan çıkarmayın; bu yöntem, özellikleri hakkında daha fazla bilgi edinildikten sonra birkaç kez yeniden derlenebilir. Son olarak, "ısınma" nın genel durumda iffy olduğunu not ediniz. Genellikle tek bir yöntemi güvenilir bir şekilde "ısınabilirken", bir dizi faktöre bağlı olarak, mütevazı bir uygulama ile bile çok daha zordur.

(Bir yöntem için JITC durum bir çeşit okuma yeteneği gömülü ayıklama araçlarına eklenemedi herhangi bir nedenle neden bilmiyorum rağmen.)

Eklendi: dikkat etmek Bir şey "snippet" kodunu kıyaslarken, tüm döngüyü yapan en dıştaki yöntem genellikle JITC (JITC'nin nasıl uygulandığına bağlı olarak) (JITC'nin nasıl uygulandığına bağlı olarak) olduğundan ve JITCed sürümünün hiçbir zaman geri dönmemesinden dolayıdır. olarak adlandırılabilir. Bu nedenle, her zaman kodun "et" i, tekrar tekrar denen ayrı bir yönteme ve döngü ile karşılaştırılan kodun aynı yönteme yerleştirilmesi için ayrı bir yönteme yerleştirilmelidir.

+0

"microbenchmark" yazdım.Daha büyük uygulamaların sabitlenmesi daha zordur. –

+0

Gerçekten. Bunlardan biri de, çöp toplama işleminin, test kutunuzun gerçek kod için beklenen çoklu seviyeye sahip olup olmadığı, sonuçların atılıp atılmadığı ve bu nedenle kodun elden geçirilip getirilemeyeceği vb. Olup olmadığını bilmelidir. ! –