SORU
26 Mayıs 2015, Salı


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
26 Mayıs 2015, Salı


TOTEM 1.8.0_45 ben kullanarak benzer sonuçlar.

Soruşturma:

  1. -XX: UnlockDiagnosticVMOptions -XX: PrintCompilation -XX: PrintInlining VM seçenekleri ile çalışan java her iki yöntem de derlenmiş ve inlined olduğunu gösterir
  2. Yöntemleri için oluşturulan derleme bakarak anlamlı bir fark kendilerini gösterir
  3. İnlined aldıktan sonra, ancak, main iç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=0 ve her iki yöntem de yavaş yavaş (varsayılan seçenekleri ile statik yöntemine benzer.
  • -XX:LoopUnrollLimit=100 ve 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.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ASUS North America

    ASUS North A

    12 AĞUSTOS 2008
  • Digital Bounds

    Digital Boun

    19 Temmuz 2013
  • jpmkm1

    jpmkm1

    4 NİSAN 2008