SORU
15 EYLÜL 2013, Pazar


64 elemanlar 1000 kat daha hızlı 65 unsurların ilan dizi ilan ile daha çok diziler

Son zamanlarda bir dizi 64 öğeleri içeren çok daha hızlı olduğunu (>ilan gördüm 1000 kat daha dizi aynı tip ilan 65 elemanları ile.

İşte bu test etmek için kullanılan kod:

public class Tests{
    public static void main(String args[]){
        double start = System.nanoTime();
        int job = 100000000;//100 million
        for(int i = 0; i < job; i  ){
            double[] test = new double[64];
        }
        double end = System.nanoTime();
        System.out.println("Total runtime = "   (end-start)/1000000   " ms");
    }
}

Bu ise new double[65] new double[64] yerine eğer yaklaşık 6 ms, yaklaşık 7 saniye sürer çalışır. Bu sorun katlanarak bu işe benim sorunum kaynaklı olduğu, daha fazla ve daha fazla iş parçacığı, yayılmış ise daha şiddetli olur.

Bu sorun da int[65] String[65]gibi diziler farklı türleri ile oluşur. Bu sorun, büyük dizeleri ile oluşmaz: String test = "many characters"; ama bu String test = i ""; içine değiştirildiğinde oluşmaya başladı

Bu durumda neden ve bu sorunu aşmak için mümkün olup olmadığını merak ediyordum.

CEVAP
15 EYLÜL 2013, Pazar


Neden olduğu bir davranış gözlemliyoruzen iyi duruma getirmeJava VM TAM zamanında derleyici tarafından yapılır. Bu davranış, tekrarlanabilir 64 unsurlar kadar skaler diziler ile tetiklenir ve diziler 64 daha büyük ile tetiklenir.

Ayrıntılara girmeden önce, bu döngünün gövdesi daha yakından bir göz atalım:

double[] test = new double[64];

Vücudun hiçbir etkisi olmaz(gözlenebilir davranış). Bu deyimi olup olmadığını program yürütme dışında bir fark yok demektir. Aynı tüm döngü için de geçerlidir. Kod iyileştirici bir döngü çeviren olur, belki bu yüzden(ya da hiç)fonksiyonel ve farklı aynı zamanlama davranışı ile.

Kriterler için en az iki aşağıdaki kurallara uymak gerekir. Eğer öyle yapmış olsaydı, bu fark önemli ölçüde daha düşük olurdu.

  • Isınma kriter birkaç kez çalıştırarak JİT derleyici (ve doktoru).
  • Her ifadenin sonucu kullanım ve kıyaslama sonunda yazdırın.

Şimdi gelelim detaya. Şaşırtıcı olmayan bir şekilde, 64 öğeleri daha büyük değil skaler diziler için tetiklenen bir optimizasyon var. Optimizasyonu Escape analysis bir parçası. Üzerine küçük küçük nesneleri ve diziler yığını onları ayırmak yerine bir yığın koyar - hatta daha da iyisi onları tamamen optimize. Brian Goetz, 2005 yılında yazdığı aşağıdaki makalede bu konu hakkında biraz bilgi bulabilirsiniz:

Optimizasyon komut satırı seçeneği -XX:-DoEscapeAnalysis ile devre dışı bırakılabilir. Skaler diziler için sihirli değeri 64 komut satırında da değiştirilebilir. Eğer aşağıdaki gibi programı çalıştırmak için, 64 ve 65 elemanları ile dizi arasında bir fark olacak

java -XX:EliminateAllocationArraySizeLimit=65 Tests

Bunu söyledikten sonra, ben şiddetle bu komut satırı seçeneklerini kullanarak vazgeçirmek. Ben gerçekçi bir uygulama büyük bir fark yapar emin değilim. Yalnızca gerekliliğini ve bazı sözde kriterler sonuçlarına göre değil, tamamen ikna olurdu ben bunu kullanmak istiyorum.

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

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Austin Evans

    Austin Evans

    5 AĞUSTOS 2007
  • case LianLi

    case LianLi

    28 Mayıs 2010
  • spyib

    spyib

    9 Ocak 2007