Uçucu pahalı?
Uçucu uygulanması hakkında The JSR-133 Cookbook for Compiler Writers okuduktan sonra, özellikle bölüm "Atom Talimatları ile Etkileşimleri" bir LoadLoad veya LoadStore bir bariyer ihtiyacı güncellemeden geçici bir değişken okuma. sanırım Bu sayfa daha aşağı LoadLoad ve LoadStore etkili hiçbir harekat x 86 İşlemciler üzerinde olduğunu görüyorum. Bu uçucu okuma işlemleri 86, ve hızlı, normal bir değişken okumak (uçucu olan yeniden düzenleme kısıtlamaları göz ardı ederek) açık önbellek geçersiz kılma olmadan yapılabilir anlamına mı geliyor?
Bu doğru anlamıyorum inanıyorum. Birisi bana aydınlatmak için olabilir mi?
EDİT: eğer işlemci çoklu ortamlarda farklılıklar olup olmadığını merak ediyorum. Tek CPU sistemleri CPU olabilir bak kendi iplik zula olarak John V. Birleşik Devletleri, ama çoklu İŞLEMCİ sistemleri olmalı yapılandırma seçeneği için CPU bu yeterli değildir ve ana bellek olmalı vurdu, yapma uçucu yavaş üzerinde çoklu işlemci sistemleri, değil mi?
Yolumu aşağıdaki harika makaleler hakkında rastladım bu, ve bu soruyu başkaları için ilginç olabilir bu yana, benim bağlantıları burada paylaşacağım: hakkında daha fazla bilgi edinmek PS:
CEVAP
Intel BM içerikli uçucu bir okuyun oldukça ucuz. Eğer aşağıdaki gibi basit bir durumda olursak:
public static long l;
public static void run() {
if (l == -1)
System.exit(-1);
if (l == -2)
System.exit(-1);
}
7 yeteneği Java yazdırma derleme kod çalışma yöntemini kullanmak gibi bir şey:
# {method} 'run2' '()V' in 'Test2'
# [sp 0x10] (sp of caller)
0xb396ce80: mov êx,-0x3000(%esp)
0xb396ce87: push ëp
0xb396ce88: sub $0x8,%esp ;*synchronization entry
; - Test2::run2@-1 (line 33)
0xb396ce8e: mov $0xffffffff,ìx
0xb396ce93: mov $0xffffffff,ëx
0xb396ce98: mov $0x6fa2b2f0,%esi ; {oop('Test2')}
0xb396ce9d: mov 0x150(%esi),ëp
0xb396cea3: mov 0x154(%esi),íi ;*getstatic l
; - Test2::run@0 (line 33)
0xb396cea9: cmp ìx,ëp
0xb396ceab: jne 0xb396ceaf
0xb396cead: cmp ëx,íi
0xb396ceaf: je 0xb396cece ;*getstatic l
; - Test2::run@14 (line 37)
0xb396ceb1: mov $0xfffffffe,ìx
0xb396ceb6: mov $0xffffffff,ëx
0xb396cebb: cmp ìx,ëp
0xb396cebd: jne 0xb396cec1
0xb396cebf: cmp ëx,íi
0xb396cec1: je 0xb396ceeb ;*return
; - Test2::run@28 (line 40)
0xb396cec3: add $0x8,%esp
0xb396cec6: pop ëp
0xb396cec7: test êx,0xb7732000 ; {poll_return}
;... lines removed
Bakarsanız 2 başvuruları için getstatic, ilk içerir bir yük bellek, ikinci atlar yük olarak değeri yeniden gelen kayıt(lar) önceden yüklenmiş (uzun 64 bit ve 32 bit laptop kullanıyor 2 kaydeder).
Eğer l değişken değişken yaparsak oluşturulan derleme farklıdır.
# {method} 'run2' '()V' in 'Test2'
# [sp 0x10] (sp of caller)
0xb3ab9340: mov êx,-0x3000(%esp)
0xb3ab9347: push ëp
0xb3ab9348: sub $0x8,%esp ;*synchronization entry
; - Test2::run2@-1 (line 32)
0xb3ab934e: mov $0xffffffff,ìx
0xb3ab9353: mov $0xffffffff,ëx
0xb3ab9358: mov $0x150,ëp
0xb3ab935d: movsd 0x6fb7b2f0(ëp),%xmm0 ; {oop('Test2')}
0xb3ab9365: movd %xmm0,êx
0xb3ab9369: psrlq $0x20,%xmm0
0xb3ab936e: movd %xmm0,íx ;*getstatic l
; - Test2::run@0 (line 32)
0xb3ab9372: cmp ìx,êx
0xb3ab9374: jne 0xb3ab9378
0xb3ab9376: cmp ëx,íx
0xb3ab9378: je 0xb3ab93ac
0xb3ab937a: mov $0xfffffffe,ìx
0xb3ab937f: mov $0xffffffff,ëx
0xb3ab9384: movsd 0x6fb7b2f0(ëp),%xmm0 ; {oop('Test2')}
0xb3ab938c: movd %xmm0,ëp
0xb3ab9390: psrlq $0x20,%xmm0
0xb3ab9395: movd %xmm0,íi ;*getstatic l
; - Test2::run@14 (line 36)
0xb3ab9399: cmp ìx,ëp
0xb3ab939b: jne 0xb3ab939f
0xb3ab939d: cmp ëx,íi
0xb3ab939f: je 0xb3ab93ba ;*return
;... lines removed
Bu durumda getstatic her iki deÄŸiÅŸken l baÅŸvurular bellekten bir yük içerir, yani deÄŸeri birden çok uçucu okur arasında bir kayıt tutulabilir. Emin olmak için orada bir atom okumak deÄŸerdir okuma ana belleÄŸe bir kayıt YAZILIMI movsd 0x6fb7b2f0(ëp),%xmm0
okuma işlemi tek bir talimat (önceki örnekte gördüğümüz 64-bit değeri normalde gerektiren iki 32 bit okur üzerinde bir 32-bit sistem).
Uçucu bir okuma maliyetini kabaca eşdeğer bir bellek yükü ve L1 önbellek erişim kadar ucuz olabilir. Eğer başka bir çekirdek önbellek satırı geçersiz olacak değişken değişken için, bir ana bellek veya L3 önbellek erişim gerektiren belki de yazılı ise. Gerçek maliyeti ağır İŞLEMCİ mimarisi bağlıdır. Hatta Intel ve AMD arasında önbellek tutarlılık protokolleri farklıdır.
Uçucu Kilitli vs vs kilit...
Ne zaman ve neden veritabanı katılır p...
Neden uçucu C Gerekli?...
Ne kadar pahalı değildir .NET yansıma?...
Neden uçucu yararlı birden çok iş parç...