Hız eşdeğer statik ve statik olmayan yöntemler büyük fark
Bu kodu ne zaman yaratıyorum bir Nesne main yöntem ve arama nesneleri yöntemi: ff.twentyDivCount(i)(çalışır 16010 ms) , çalışır çok daha hızlı arama kullanarak bu ek açıklama: twentyDivCount(i)(çalışır 59516 ms). Ben bir nesne oluşturmadan çalıştırmak tabii ki, ben bu yöntemi statik, esas olarak çağrılabilir.
public class ProblemFive {
// Counts the number of numbers that the entry is evenly divisible by, as max is 20
int twentyDivCount(int a) { // Change to static int.... when using it directly
int count = 0;
for (int i = 1; i<21; i ) {
if (a % i == 0) {
count ;
}
}
return count;
}
public static void main(String[] args) {
long startT = System.currentTimeMillis();;
int start = 500000000;
int result = start;
ProblemFive ff = new ProblemFive();
for (int i = start; i > 0; i--) {
int temp = ff.twentyDivCount(i); // Faster way
// twentyDivCount(i) - slower
if (temp == 20) {
result = i;
System.out.println(result);
}
}
System.out.println(result);
long end = System.currentTimeMillis();;
System.out.println((end - startT) " ms");
}
}
EDİT: şimdiye Kadar farklı makinelerde farklı sonuçlar üretmek gibi görünüyor, ama 1.8.* TOTEM kullanarak orijinal sonucu sürekli olarak yeniden gibi görünüyor.
CEVAP
TOTEM 1.8.0_45 ben kullanarak benzer sonuçlar.
SoruÅŸturma:
-XX: UnlockDiagnosticVMOptions -XX: PrintCompilation -XX: PrintInliningVM seçenekleri ile çalışan java her iki yöntem de derlenmiş ve inlined olduğunu gösterir- Yöntemleri için oluşturulan derleme bakarak anlamlı bir fark kendilerini gösterir
- İnlined aldıktan sonra, ancak,
mainiçinde oluşturulan derleme çok farklı, örnek yöntemi daha agresif, özellikle döngü çözümü açısından optimize edilmiş olması
Ben sonra testi tekrar ama farklı döngü ayarları şüpheden uzak onaylamak için çözümü ile koştu. Kodunuzu inceledim:
-XX:LoopUnrollLimit=0ve her iki yöntem de yavaş yavaş (varsayılan seçenekleri ile statik yöntemine benzer.-XX:LoopUnrollLimit=100ve her iki yöntem de hızlı (varsayılan seçenekler örneği yöntemine benzer.
Sonuç olarak, varsayılan ayarlar, JİT ile görünüyornoktasal 1.8.0_45mümkün değil bu yöntem statik döngü göz önüne sermek bu şekilde davranır neden emin değilim rağmen). Diğer Jvm'ler farklı sonuçlar verebilir.

Statik sınıf ve singleton deseni arası...
Python statik yöntemler?...
Neden't statik yöntemler Java'da ...
't neden C# Statik Yöntemler bir ...
Şişman statik kütüphane (aygıt simülat...