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
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ığındaInteger.MAX_VALUE
ve sonra döngüyü sona erdirir artırılır.i < Integer.MAX_VALUE
bir tamsayı taşması içeriyor. Bir zamanlari
ulaşana kadar, bir olarak artırılırInteger.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.
Neden't GCC*****a (**)*(**) optim...
Bir değişken bir tamsayı olup olmadığı...
Neden diğerleri üzerinde bazı platform...
Neden imzasız taşma tanımlanan davranı...
Neden't değil .Kuyruk özyineleme ...