JİT Tamsayı içeren optimize bir döngü değil.MAX_VALUE | Netgez.com
SORU
15 AÄžUSTOS 2014, Cuma


JİT Tamsayı içeren optimize bir döngü değil.MAX_VALUE

* *35, cevap yazarken JİT optimizasyonu için sınır tuhaf bir durum fark ettim.

Aşağıdaki programdırdeğil"Microbenchmark" vedeğilamaçlanan güvenilir bir yürütme zamanı ölçmek için diğer soruya cevap olarak belirttiği gibi). Sadece MCVE olarak sorunu yeniden oluşturmak için tasarlanmıştır:

class MissedLoopOptimization
{
    public static void main(String args[])
    {
        for (int j=0; j<3; j  )
        {
            for (int i=0; i<5; i  )
            {
                long before = System.nanoTime();
                runWithMaxValue();
                long after = System.nanoTime();
                System.out.println("With MAX_VALUE   : " (after-before)/1e6);
            }
            for (int i=0; i<5; i  )
            {
                long before = System.nanoTime();
                runWithMaxValueMinusOne();
                long after = System.nanoTime();
                System.out.println("With MAX_VALUE-1 : " (after-before)/1e6);
            }
        }
    }

    private static void runWithMaxValue()
    {
        final int n = Integer.MAX_VALUE;
        int i = 0;
        while (i   < n) {}
    }

    private static void runWithMaxValueMinusOne()
    {
        final int n = Integer.MAX_VALUE-1;
        int i = 0;
        while (i   < n) {}
    }
}

Bu sınırı n Integer.MAX_VALUE-1 Integer.MAX_VALUE, ve bir kez ayarlandığı temelde aynı döngü, while (i < n){}, çalışır.

GÖRDÜM 1.7.0_21 ile Windows 7/64 bu çalıştırırken

java -server MissedLoopOptimization

zamanlama sonuçlar aşağıdaki gibidir

...
With MAX_VALUE   : 1285.227081
With MAX_VALUE   : 1274.36311
With MAX_VALUE   : 1282.992203
With MAX_VALUE   : 1292.88246
With MAX_VALUE   : 1280.788994
With MAX_VALUE-1 : 6.96E-4
With MAX_VALUE-1 : 3.48E-4
With MAX_VALUE-1 : 0.0
With MAX_VALUE-1 : 0.0
With MAX_VALUE-1 : 3.48E-4

Belli ki, MAX_VALUE-1 JİT durum için tahmin ne yapar: döngü yararsız olduğunu algılar ve tamamen ortadan kaldırır. Ancak, öyledeğil14 ** için çalışan, sarılan döngü kaldırın.

Bu gözlem ile başlayan zaman TAM zamanında derleme çıktısı bir göz tarafından onaylandı

java -server -XX: UnlockDiagnosticVMOptions -XX: TraceClassLoading -XX: LogCompilation -XX: PrintAssembly MissedLoopOptimization

Günlüğü MAX_VALUE çalışır bu yöntem için aşağıdaki montaj içerir:

Decoding compiled method 0x000000000254fa10:
Code:
[Entry Point]
[Verified Entry Point]
[Constants]
  # {method} 'runWithMaxValue' '()V' in 'MissedLoopOptimization'
  #           [sp 0x20]  (sp of caller)
  0x000000000254fb40: sub    $0x18,%rsp
  0x000000000254fb47: mov    %rbp,0x10(%rsp)    ;*synchronization entry
                                                ; - MissedLoopOptimization::runWithMaxValue@-1 (line 29)
  0x000000000254fb4c: mov    $0x1,%r11d
  0x000000000254fb52: jmp    0x000000000254fb63
  0x000000000254fb54: nopl   0x0(%rax,%rax,1)
  0x000000000254fb5c: data32 data32 xchg %ax,%ax
  0x000000000254fb60: inc    %r11d              ; OopMap{off=35}
                                                ;*goto
                                                ; - MissedLoopOptimization::runWithMaxValue@11 (line 30)
  0x000000000254fb63: test   êx,-0x241fb69(%rip)        # 0x0000000000130000
                                                ;*goto
                                                ; - MissedLoopOptimization::runWithMaxValue@11 (line 30)
                                                ;   {poll}
  0x000000000254fb69: cmp    $0x7fffffff,%r11d
  0x000000000254fb70: jl     0x000000000254fb60  ;*if_icmpge
                                                ; - MissedLoopOptimization::runWithMaxValue@8 (line 30)
  0x000000000254fb72: add    $0x10,%rsp
  0x000000000254fb76: pop    %rbp
  0x000000000254fb77: test   êx,-0x241fb7d(%rip)        # 0x0000000000130000
                                                ;   {poll_return}
  0x000000000254fb7d: retq   
  0x000000000254fb7e: hlt    
  0x000000000254fb7f: hlt    
[Exception Handler]
[Stub Code]
  0x000000000254fb80: jmpq   0x000000000254e820  ;   {no_reloc}
[Deopt Handler Code]
  0x000000000254fb85: callq  0x000000000254fb8a
  0x000000000254fb8a: subq   $0x5,(%rsp)
  0x000000000254fb8f: jmpq   0x0000000002528d00  ;   {runtime_call}
  0x000000000254fb94: hlt    
  0x000000000254fb95: hlt    
  0x000000000254fb96: hlt    
  0x000000000254fb97: hlt    

Açık döngü görebilirsiniz, 0x7fffffff karşılaştırma ve atlama inc ile. Buna karşılık, 20* *için çalışan kişiler için derleme:

Decoding compiled method 0x000000000254f650:
Code:
[Entry Point]
[Verified Entry Point]
[Constants]
  # {method} 'runWithMaxValueMinusOne' '()V' in 'MissedLoopOptimization'
  #           [sp 0x20]  (sp of caller)
  0x000000000254f780: sub    $0x18,%rsp
  0x000000000254f787: mov    %rbp,0x10(%rsp)    ;*synchronization entry
                                                ; - MissedLoopOptimization::runWithMaxValueMinusOne@-1 (line 36)
  0x000000000254f78c: add    $0x10,%rsp
  0x000000000254f790: pop    %rbp
  0x000000000254f791: test   êx,-0x241f797(%rip)        # 0x0000000000130000
                                                ;   {poll_return}
  0x000000000254f797: retq   
  0x000000000254f798: hlt    
  0x000000000254f799: hlt    
  0x000000000254f79a: hlt    
  0x000000000254f79b: hlt    
  0x000000000254f79c: hlt    
  0x000000000254f79d: hlt    
  0x000000000254f79e: hlt    
  0x000000000254f79f: hlt    
[Exception Handler]
[Stub Code]
  0x000000000254f7a0: jmpq   0x000000000254e820  ;   {no_reloc}
[Deopt Handler Code]
  0x000000000254f7a5: callq  0x000000000254f7aa
  0x000000000254f7aa: subq   $0x5,(%rsp)
  0x000000000254f7af: jmpq   0x0000000002528d00  ;   {runtime_call}
  0x000000000254f7b4: hlt    
  0x000000000254f7b5: hlt    
  0x000000000254f7b6: hlt    
  0x000000000254f7b7: hlt    

Integer.MAX_VALUE-1 olduğu gibi aynı şekilde en iyi duruma getirerek gelen JİT engeller Integer.MAX_VALUE hakkında bu kadar özel olan Ne? yani benim soru: Benim tahminim cmp Talimat ile ilgisi var, için tasarlanmış olabilirimzaladıaritmetik, ama bu tek başına ikna edici bir sebep değil. Herkes bu durumda tedavi nerede bu açıklar, ve hatta belki de OpenJDK Noktasal kodu için bir işaretçi verebilir misiniz?

(Bir kenara: umarım bu cevabı da açıklar farklı davranış arasında i i bunu sordu için diğer soru, varsayarak bu nedenle eksik optimizasyonu (belli ki)aslındaInteger.MAX_VALUE döngü sınırı) neden olduğu

CEVAP
15 AÄžUSTOS 2014, Cuma


Java Dil Şartnamesi çıkarmış değilim, ama bu bir fark ile bir ilgisi olduğunu tahmin ediyorum:

  • i < (Integer.MAX_VALUE - 1) asla taşıyor. i Integer.MAX_VALUE - 1 ulaÅŸtığında Integer.MAX_VALUE ve sonra döngüyü sona erdirir artırılır.

  • i < Integer.MAX_VALUE bir tamsayı taÅŸması içeriyor. Bir zamanlar i ulaÅŸana kadar, bir olarak artırılır Integer.MAX_VALUE taÅŸma oluyorsonradöngü sona erer.

JİT derleyici olduğunu varsayıyorum "isteksiz" için optimize-döngüler böyle köşe koşulları ile whole bunch of bugs w vardı.r.t. döngü tamsayı taşması koşullarda optimizasyonu, isteksizlik muhtemelen oldukça garantilidir.

Ayrıca ben tamsayı beri taşmaları doğrudan algılanabilir olmayan bir şekilde şüphe veya başka bir Java işlenmiş olsa da tamsayı taşmaları-optimize izin vermeyen bazı sabit gereksinimi olabilir.

Bunu PaylaÅŸ:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VÄ°DEO

Rastgele Yazarlar

  • Bryan Smith

    Bryan Smith

    12 Mart 2006
  • Lamarr Wilson

    Lamarr Wilso

    27 Aralık 2008
  • Whizzpopping

    Whizzpopping

    10 Kasım 2005