🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.java
Article #141810

Re: Szybkość Javy wg Horstmanna a testy...

#141810
From: Marcin Mielżyński
Date: Wed, 22 Oct 2008 18:52
655 lines
23880 bytes
jarekr pisze:
> 
>> Przygotowywanie tego rodzaju testów jest bardzo delikatną sprawą bo
>> trzeba wziąć pod uwagę znacznie więcej współczynników niż zdajecie sobie
>> sprawy a nawet wtedy interpretacja wyników nie jest tak prosta jak
>> wskazanie kierunku relacji większości.
> NIkt tu nie  o jakiejś poważnej interpretacji wyników - oprócz trollka
> - nie mówi.
> Osobiście ciekawi mnie gdzie co gcc robi lepiej od C2 na  podanym
> kawałku kodu. (bo może trzeba mu coś poprawić :-) ).
> 
> Tak przy okazji.
> W sumie parę ciekawych wyników mam przy okazji tego zagadnienia.
> Np. bardzo zawiodłem się na implementacji System arraycopy.
> Z dobrych rzeczy natomiast  - w Dolphin (java 7.0) sensownie
> przeorganizowali ( w źródłach JVM) - kompilację
> native wrapperów.(library_call.cpp). Teraz dodanie (na poziomie kodu
> JVM) nowych jest dość proste i można się spodziewać
> że w niedalekiej przyszłości dużo nowych funkcji z jdk będzie miało
> native wrappery bez JNI zrobione (czyli tak jak Math.sin i inne).
> 
Tu nie ma żadnego jni i wcale niewiele się zmieni w 7ce. Metody typu 
"arraycopy", "indexOf", "hashCode" etc, to są tzw intrinsics 
(vmSymbols.hpp) (Nawet InvokeDynamic bazuje na intrinsics a nie na 
dodatkowym rozkazie, np MethodHandle, AnonymousClassLoader, czy pool 
patchery). One są bezpośrednio stubowane w natywny kod, ale przedtem ich 
argumenty podlegają takim samym optymalizacjom jak np. GVN na grafie 
SSA/MachNode jak normalny kod (przy "arraycopy" następuje nawet 
eliminacja sprawdzeń zasięgu dla tablic, czy src > 0 itp).


W przypadku tego benchmarku pechowy jest OSR, czyli rekompilacja w locie 
(w czasie działania pętli) i resynchronizacja ramki interpretera i stosu 
natywnego.

http://java.sun.com/developer/technicalArticles/Networking/HotSpot/onstack.html

więc (8x główna metoda):

java -server -XX:+PrintCompilation exp


   1       java.util.BitSet::wordIndex (5 bytes)
   2       java.util.BitSet::checkInvariants (111 bytes)
   3       java.util.BitSet::set (58 bytes)
   4       java.util.BitSet::expandTo (23 bytes)
   1%      exp::foo @ 24 (183 bytes)			// nastąpił OSR
   5       java.util.BitSet::ensureCapacity (39 bytes)
   6       java.util.BitSet::clear (70 bytes)
   7       java.util.BitSet::recalculateWordsInUse (39 bytes)
   8       java.util.BitSet::get (69 bytes)
   1%  made not entrant  (2)  exp::foo @ 24 (183 bytes)  // metoda 
kompilowana przez OSR staje się zombi a potem nastąpi rekompilacja (btw, 
to kompilacja zewnętrznego while'a który też był mierzony)
Ilosc: 2
172 ms.
   9       exp::foo (183 bytes)
   2%      exp::foo @ 24 (183 bytes) // ...


więcej będzie widać przy:
java -server -XX:+UnlockDiagnosticVMOptions -XX:+LogCompilation exp

...
<task_queued compile_id='1' compile_kind='osr' method='exp foo ()V' 
bytes='183' count='1' backedge_count='14563' iicount='1' osr_bci='24' 
stamp='0.117' comment='backedge_count' hot_count='14563'/>
...
<nmethod compile_id='1' compile_kind='osr' compiler='C2' level='2' 
entry='0x009aefe0' size='2216' address='0x009aeec8' 
relocation_offset='180' code_offset='280' stub_offset='1208' 
consts_offset='1263' scopes_data_offset='1264' scopes_pcs_offset='1880' 
dependencies_offset='2072' handler_table_offset='2084' 
nul_chk_table_offset='2180' oops_offset='2192' method='exp foo ()V' 
bytes='183' count='1' backedge_count='14563' iicount='1' stamp='0.125'/>
...



<make_not_entrant thread='2384' compile_id='1' compile_kind='osr' 
compiler='C2' level='2' stamp='0.279'/>
...


rekompilacja:

<task_queued compile_id='9' method='exp foo ()V' bytes='183' count='2' 
backedge_count='5000' iicount='2' decompiles='1' null_assert_traps='1' 
stamp='0.279' comment='count' hot_count='2'/>

<nmethod compile_id='9' compiler='C2' level='2' entry='0x009b05c0' 
size='4052' address='0x009b0408' relocation_offset='180' 
code_offset='440' stub_offset='1720' consts_offset='1885' 
scopes_data_offset='1888' scopes_pcs_offset='3212' 
dependencies_offset='3572' handler_table_offset='3584' 
oops_offset='4016' method='exp foo ()V' bytes='183' count='2' 
backedge_count='5000' iicount='2' decompiles='1' null_assert_traps='1' 
stamp='0.293'/>
<writer thread='2384'/>
...
<task_queued compile_id='2' compile_kind='osr' method='exp foo ()V' 
bytes='183' count='2' backedge_count='6024' iicount='2' decompiles='1' 
null_assert_traps='1' osr_bci='24' stamp='0.293' 
comment='backedge_count' hot_count='6024'/>

decompiles='1' mówi że musiała nastąpić dekompilacja w celu 
synchronizacji ramki interpretera z ramka natywną (liczniki pętli i inne 
zmienne lokalne)
W przypadkach uncommon_traps (np null_check, range_check, class_unloaded 
itp) mówi się na to bail-out (sytuacje nieprzewidziane i lub pogwałcenie 
semantyki javy).

btw, żadne opcje typu poniżej nie będą mieć większego znaczenia:
-XX:CompileThreshold=100, nie w tym przypadku, 100 a 250000 dla takich 
benchmarkow to mała różnica, btw, to może zmylić heurystyki profilera 
onlinowego, (warto tu też wspomnieć o MaxInlineSize i MaxInlineLevel)
-XX:+AggressiveOpts, jest dość spekulacyjna
-XX:+UseFastAccessorMethods, jest domyślna, a i tak hotspot je zainlinuje
-Xverify:none, weryfikator bytecodu (znaczenie tylko przy startup, ale i 
tak wtedy lepiej skorzystać z bootclasspath)
-XX:+UseBiasedLocking, bez komentarza



java -server -XX:+PrintOptoAssembly exp

Kod natywny wydaje się być duży, głównie dlatego że zainlinowane zotały 
wszystkie metody BitSet itp. Kosztują tutaj guardy hotspota: 
uncommon_trap(reason='range_check' action='make_not_entrant'), 
uncommon_trap(reason='null_check' action='maybe_recompile') i guardy 
samego bitset'a (np: public boolean get(int bitIndex)), private void 
checkInvariants()).

np:
0ce   	MOV    EDI,[EBX] ! Field java/util/BitSet.words
0d0   	MOV    ECX,[EDI + #8]
0d3   	NullCheck EDI

Generalnie warto napisać własny bitset lub bezpośrednio walić w tablice 
z modulo i maską.

Warto też zwrócić uwagę na:
CALL_LEAF,runtime  OSR_migration_end

I na koniec: pisać MAŁE METODY... (po co hotpost ma kompilować złożone 
metody z inicjalizacjami i rzadko podążanymi ścieżkami ?, utrudnia to 
wszystko, od analizy SSA aż po alokację rejestrów, hotspot może wtedy 
nawet zrezygnować z kompilacji ze względu na zbyt dużą złożoność czy 
przepełnienie CodeCache -XX:+PrintInlining).

{method}
  - klass: {other class}
  - method holder:     'exp'
  - constants:         0x084e7fd4{constant pool}
  - access:            0xc1000008  static
  - name:              'foo'
  - signature:         '()V'
  - max stack:         6
  - max locals:        8
  - size of params:    0
  - method size:       20
  - vtable index:      -2
  - code size:         183
  - code start:        0x141ed3e0
  - code end (excl):   0x141ed497
  - method data:       0x141eda50
  - checked ex length: 0
  - linenumber start:  0x141ed497
  - localvar length:   0
#
#  void ( rawptr:BotPTR )
#
#r000 ecx   : parm 0: rawptr:BotPTR
# -- Old esp -- Framesize: 80 --
#r045 esp+76: return address
#r044 esp+72: pad2, in_preserve
#r043 esp+68: pad2, in_preserve
#r042 esp+64: Fixed slot 0
#r061 esp+60: spill
#r060 esp+56: spill
#r059 esp+52: spill
#r058 esp+48: spill
#r057 esp+44: spill
#r056 esp+40: spill
#r055 esp+36: spill
#r054 esp+32: spill
#r053 esp+28: spill
#r052 esp+24: spill
#r051 esp+20: spill
#r050 esp+16: spill
#r049 esp+12: spill
#r048 esp+ 8: spill
#r047 esp+ 4: spill
#r046 esp+ 0: outgoing argument
#
000   N577: #	B1 <- BLOCK HEAD IS JUNK   Freq: 1
000   	INT3
       	NOP 	# 3 bytes pad for loops and calls

004   B1: #	B34 B2 <- BLOCK HEAD IS JUNK   Freq: 1
004   	# stack bang
	PUSHL  EBP
	SUB    ESP,72	# Create frame
012   	MOV    EBX,[ECX + #8]
015   	MOV    EDI,[ECX + #16]
018   	MOV    [ESP + #4],EDI
01c   	MOV    EBP,[ECX + #28]
01f   	MOV    [ESP + #8],EBP
023   	MOV    EDI,[ECX + #12]
026   	MOV    [ESP + #20],EDI
02a   	MOV    ESI,ECX
02c   	MOV    EBP.lo,[ESI + #20]
	MOV    EBP.hi,[ESI + #20]+4
032   	MOV    [ESP + #24],EBP
	MOV    [ESP + #28],EDI
03a   	MOV    [ESP + #0],ECX
03d   	CALL_LEAF,runtime  OSR_migration_end
         No JVM State Info
         #
042   	MOV    EBP,[ESP + #4]
046   	TEST   EBP,EBP
048   	Jeq    B34  P=0.001000 C=-1.000000
048
04e   B2: #	B33 B3 <- B1  Freq: 0.999
04e   	MOV    EAX,EBP
050   	MOV    ECX,[EBP + #4]
053   	CMPu   ECX,precise klass java/util/BitSet: 
0x00a05b20:Constant:exact *
059   	Jne,u  B33  P=0.100000 C=-1.000000
059
05f   B3: #	B4 <- B2  Freq: 0.8991
05f   	#checkcastPP of EAX
05f   	LEA    EBP,[EAX + #8]
062   	LEA    ECX,[EAX + #16]
065   	MOV    EDI,EAX
065
067   B4: #	B14 B5 <- B3 B34  Freq: 0.9001
067   	MOV    EDX,[ESP + #8]
06b   	INC    EDX
06c   	CMP    EBX,[ESP + #8]
070   	Jgt    B14  P=0.000000 C=11264.000000
       	NOP 	# 10 bytes pad for loops and calls

080   B5: #	B40 B6 <- B4 B13 	Loop: B5-B13 inner stride: not constant 
Freq: 216881
080   	TEST   EDI,EDI
082   	Jeq    B40  P=0.000001 C=-1.000000
082
088   B6: #	B39 B7 <- B5  Freq: 216881
088   	TEST   EBX,EBX
08a   	Jlt    B39  P=0.000000 C=6701.000000
08a
090   B7: #	B10 B8 <- B6  Freq: 216881
090   	MOV    [ESP + #36],EBX
094   	MOV    [ESP + #32],EDX
098   	MOV    [ESP + #16],EDI
09c   	MOV    [ESP + #12],ECX
0a0   	MOV    ECX,[EBP] ! Field java/util/BitSet.wordsInUse
0a3   	MOV    [ESP + #4],EBP
0a7   	MOV    EBP,EBX
0a9   	SAR    EBP,#6
0ac   	MOV    EBX,EBP
0ae   	INC    EBX
0af   	MOV    [ESP + #40],EBX
0b3   	CMP    ECX,EBX
0b5   	Jge,s  B10  P=0.984331 C=6701.000000
0b5
0b7   B8: #	B38 B9 <- B7  Freq: 3398.37
0b7   	MOV    ECX,EDI
0b9   	MOV    EDX,EBX
0bb   	CALL,static  java.util.BitSet::ensureCapacity
         # java.util.BitSet::expandTo @ bci:14  L[0]=esp + #16 L[1]=_ 
L[2]=esp + #40
         # java.util.BitSet::set @ bci:38  L[0]=esp + #16 L[1]=esp + #36 
L[2]=EBP
         # exp::foo @ bci:33  L[0]=esp + #8 L[1]=esp + #24 L[2]=_ 
L[3]=esp + #16 L[4]=esp + #20 L[5]=esp + #36 L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)
AllocatedObj(0x03fbe9f4)
AllocatedObj(0x03fbe9f4)

0c0
0c0   B9: #	B10 <- B8  Freq: 3398.3
         # Block is sole successor of call
0c0   	MOV    EBX,[ESP + #4]
0c4   	MOV    ECX,[ESP + #40]
0c8   	MOV    [EBX],ECX ! Field java/util/BitSet.wordsInUse
0c8
0ca   B10: #	B37 B11 <- B9 B7  Freq: 216881
0ca   	MOV    EBX,[ESP + #12]
0ce   	MOV    EDI,[EBX] ! Field java/util/BitSet.words
0d0   	MOV    ECX,[EDI + #8]
0d3   	NullCheck EDI
0d3
0d3   B11: #	B36 B12 <- B10  Freq: 216881
0d3   	CMPu   EBP,ECX
0d5   	Jge,u  B36  P=0.000001 C=-1.000000
0d5
0db   B12: #	B35 B13 <- B11  Freq: 216880
0db   	LEA    ESI,[EDI + EBP << #3]
0de   	MOV    EAX.lo,#1.lo
	MOV    EAX.hi,#1.hi
0e5   	MOV    ECX,[ESP + #36]
0e9   	TEST   ECX,32
	JEQ,s  small
	MOV    EAX.hi,EAX.lo
	XOR    EAX.lo,EAX.lo
small:	SHLD   EAX.hi,EAX.lo,ECX
	SHL    EAX.lo,ECX
0fa   	OR     EAX.lo,[ESI + #16]
	OR     EAX.hi,[ESI + #16]+4
100   	MOV    [EDI + #16 + EBP << #3],EAX.lo
	MOV    [EDI + #16 + EBP << #3]+4,EAX.hi
108   	MOV    EBX,ECX
10a   	INC    EBX
10b   	CMP    EBX,[ESP + #32]
10f   	Jge    B35	# Loop end  P=0.000000 C=11264.000000
10f
115   B13: #	B5 <- B12  Freq: 216880
115   	MOV    EBP,[ESP + #4]
119   	MOV    ECX,[ESP + #12]
11d   	MOV    EDI,[ESP + #16]
121   	MOV    EDX,[ESP + #32]
125   	JMP    B5
125
12a   B14: #	B27 B15 <- B35 B4  Freq: 0.103417
12a   	MOV    ESI,#2
12f   	MOV    ECX,[ESP + #8]
133   	CMP    ECX,#4
136   	Jlt    B27  P=0.500000 C=-1.000000
136
13c   B15: #	B43 B16 <- B14 B25 	Loop: B15-B25  Freq: 0.51683
13c   	TEST   EDI,EDI
13e   	Jeq    B43  P=0.000001 C=-1.000000
13e
144   B16: #	B42 B17 <- B15  Freq: 0.516829
144   	MOV    [ESP + #16],ESI
148   	MOV    [ESP + #12],EDX
14c   	MOV    [ESP + #8],EDI
150   	MOV    [ESP + #4],ECX
154   	MOV    ECX,EDI
156   	MOV    EDX,ESI
158   	NOP 	# 3 bytes pad for loops and calls
15b   	CALL,static  java.util.BitSet::get
         # exp::foo @ bci:57  L[0]=esp + #4 L[1]=esp + #24 L[2]=_ 
L[3]=esp + #8 L[4]=esp + #20 L[5]=esp + #16 L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)

160
160   B17: #	B23 B18 <- B16  Freq: 0.516819
         # Block is sole successor of call
160   	TEST   EAX,EAX
162   	Jeq,s  B23  P=0.100000 C=-1.000000
162
164   B18: #	B24 B19 <- B17  Freq: 0.465137
164   	MOV    EBX,[ESP + #20]
168   	INC    EBX
169   	MOV    EBP,[ESP + #16]
16d   	SHL    EBP,#1
16f   	CMP    EBP,[ESP + #4]
173   	Jgt,s  B24  P=0.500000 C=-1.000000
       	NOP 	# 11 bytes pad for loops and calls

180   B19: #	B41 B20 <- B18 B21 	Loop: B19-B21 inner stride: not 
constant  Freq: 2.3255
180   	MOV    [ESP + #20],EBX
184   	MOV    ECX,[ESP + #8]
188   	MOV    EDX,EBP
18a   	NOP 	# 1 bytes pad for loops and calls
18b   	CALL,static  java.util.BitSet::clear
         # exp::foo @ bci:81  L[0]=esp + #4 L[1]=esp + #24 L[2]=_ 
L[3]=esp + #8 L[4]=esp + #20 L[5]=esp + #16 L[6]=EBP L[7]=_
         # AllocatedObj(0x03fbe9f4)

190
190   B20: #	B22 B21 <- B19  Freq: 2.32545
         # Block is sole successor of call
190   	INC    EBP
191   	CMP    EBP,[ESP + #12]
195   	Jge,s  B22  P=0.100000 C=-1.000000
195
197   B21: #	B19 <- B20  Freq: 2.09291
197   	MOV    EBX,[ESP + #20]
19b   	JMP,s  B19
19b
19d   B22: #	B24 <- B20  Freq: 0.232545
19d   	MOV    EBX,[ESP + #20]
1a1   	JMP,s  B24
1a1
1a3   B23: #	B24 <- B17  Freq: 0.0516819
1a3   	MOV    EBX,[ESP + #20]
1a3
1a7   B24: #	B26 B25 <- B22 B18 B23  Freq: 0.516796
1a7   	MOV    ESI,[ESP + #16]
1ab   	INC    ESI
1ac   	TSTL   #polladdr,EAX	! Safepoint: poll for GC        # exp::foo @ 
bci:96  L[0]=esp + #4 L[1]=esp + #24 L[2]=_ L[3]=esp + #8 L[4]=EBX 
L[5]=ESI L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)

1b2   	MOV    ECX,ESI
1b4   	IMUL   ECX,ESI
1b7   	CMP    ECX,[ESP + #4]
1bb   	Jgt,s  B26  P=0.100000 C=-1.000000
1bb
1bd   B25: #	B15 <- B24  Freq: 0.465116
1bd   	MOV    ECX,[ESP + #4]
1c1   	MOV    [ESP + #20],EBX
1c5   	MOV    EDI,[ESP + #8]
1c9   	MOV    EDX,[ESP + #12]
1cd   	JMP    B15
1cd
1d2   B26: #	B44 <- B24  Freq: 0.0516796
1d2   	MOV    ECX,[ESP + #4]
1d6   	MOV    EDI,[ESP + #8]
1da   	MOV    EDX,[ESP + #12]
1de   	JMP    B44
1de
1e3   B27: #	B44 <- B14  Freq: 0.0517085
1e3   	MOV    EBX,[ESP + #20]
1e7   	JMP    B44
1e7
1ec   B28: #	B29 <- B44  Freq: 0.051694
1ec   	MOV    [ESP + #16],ESI
1ec
1f0   B29: #	B49 B30 <- B28 B32 	Loop: B29-B32 inner stride: not 
constant  Freq: 0.516894
1f0   	TEST   EDI,EDI
1f2   	Jeq    B49  P=0.000001 C=-1.000000
1f2
1f8   B30: #	B47 B31 <- B29  Freq: 0.516894
1f8   	MOV    [ESP + #12],EDX
1fc   	MOV    [ESP + #8],EDI
200   	MOV    [ESP + #4],EBX
204   	MOV    EBP,ECX
206   	MOV    ECX,EDI
208   	MOV    EDX,[ESP + #16]
20c   	NOP 	# 3 bytes pad for loops and calls
20f   	CALL,static  java.util.BitSet::get
         # exp::foo @ bci:108  L[0]=EBP L[1]=esp + #24 L[2]=_ L[3]=esp + 
#8 L[4]=esp + #4 L[5]=esp + #16 L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)

214
214   B31: #	B45 B32 <- B30  Freq: 0.516883
         # Block is sole successor of call
214   	MOV    ECX,[ESP + #4]
218   	INC    ECX
219   	TEST   EAX,EAX
21b   	MOV    EBX,[ESP + #4]
21f   	CMOVne EBX,ECX
222   	MOV    ECX,[ESP + #16]
226   	INC    ECX
227   	CMP    ECX,[ESP + #12]
22b   	Jge    B45	# Loop end  P=0.100000 C=-1.000000
22b
231   B32: #	B29 <- B31  Freq: 0.465195
231   	MOV    [ESP + #16],ECX
235   	MOV    ECX,EBP
237   	MOV    EDI,[ESP + #8]
23b   	MOV    EDX,[ESP + #12]
23f   	JMP,s  B29
23f
241   B33: #	N577 <- B2  Freq: 1e-006
241   	MOV    ECX,#-75
246   	MOV    EBP,[ESP + #8]
24a   	PUSH   [ESP + #24]
	POP    [ESP + #8]
	PUSH   [ESP + #28]
	POP    [ESP + #12]
25a   	PUSH   [ESP + #20]
	POP    [ESP + #4]
262   	MOV    [ESP + #16],EBX
266   	MOV    [ESP + #20],EAX
26a   	NOP 	# 1 bytes pad for loops and calls
26b   	CALL,static  wrapper for: uncommon_trap(reason='unreached' 
action='reinterpret')
         # exp::foo @ bci:24  L[0]=EBP L[1]=esp + #8 L[2]=_ L[3]=esp + 
#20 L[4]=esp + #4 L[5]=esp + #16 L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)

270   	INT3   ; ShouldNotReachHere
270
271   B34: #	B4 <- B1  Freq: 0.000999987
271   	MOV    EBP,NULL+8
276   	MOV    ECX,NULL+16
27b   	MOV    EDI,NULL
280   	JMP    B4
280
285   B35: #	B14 <- B12  Freq: 0.103417
285   	MOV    EDI,[ESP + #16]
289   	MOV    EDX,[ESP + #32]
28d   	JMP    B14
28d
292   B36: #	N577 <- B11  Freq: 1e-006
292   	MOV    ECX,#-28
297   	PUSH   [ESP + #8]
	POP    [ESP + #4]
29f   	PUSH   [ESP + #24]
	POP    [ESP + #8]
	PUSH   [ESP + #28]
	POP    [ESP + #12]
2af   	PUSH   [ESP + #36]
	POP    [ESP + #24]
2b7   	MOV    [ESP + #36],EDI
2bb   	CALL,static  wrapper for: uncommon_trap(reason='range_check' 
action='make_not_entrant')
         # java.util.BitSet::set @ bci:47  L[0]=esp + #16 L[1]=esp + #24 
L[2]=_ STK[0]=esp + #36 STK[1]=EBP STK[2]=esp + #36 STK[3]=EBP
         # exp::foo @ bci:33  L[0]=esp + #4 L[1]=esp + #8 L[2]=_ 
L[3]=esp + #16 L[4]=esp + #20 L[5]=esp + #24 L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)
AllocatedObj(0x03fbe9f4)

2c0   	INT3   ; ShouldNotReachHere
2c0
2c1   B37: #	N577 <- B10  Freq: 1e-006
2c1   	MOV    ECX,#-10
2c6   	MOV    [ESP + #4],EDI
2ca   	NOP 	# 1 bytes pad for loops and calls
2cb   	CALL,static  wrapper for: uncommon_trap(reason='null_check' 
action='maybe_recompile')
         # java.util.BitSet::set @ bci:47  L[0]=_ L[1]=_ L[2]=_ STK[0]=_ 
STK[1]=_ STK[2]=esp + #4 STK[3]=EBP
         # exp::foo @ bci:33  L[0]=_ L[1]=_ L[2]=_ L[3]=_ L[4]=_ L[5]=_ 
L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)

2d0   	INT3   ; ShouldNotReachHere
2d0
2d1   B38: #	B48 <- B8  Freq: 0.0339837
2d1   	# exception oop is in EAX; no code emitted
2d1   	MOV    ECX,EAX
2d3   	JMP    B48
2d3
2d8   B39: #	N577 <- B6  Freq: 1e-006
2d8   	MOV    ECX,#21
2dd   	MOV    EBP,[ESP + #8]
2e1   	PUSH   [ESP + #24]
	POP    [ESP + #8]
	PUSH   [ESP + #28]
	POP    [ESP + #12]
2f1   	MOV    [ESP + #4],EDI
2f5   	PUSH   [ESP + #20]
	POP    [ESP + #16]
2fd   	MOV    [ESP + #20],EBX
301   	NOP 	# 2 bytes pad for loops and calls
303   	CALL,static  wrapper for: uncommon_trap(reason='unloaded' 
action='reinterpret' index='21')
         # java.util.BitSet::set @ bci:4  L[0]=_ L[1]=esp + #20 L[2]=_
         # exp::foo @ bci:33  L[0]=EBP L[1]=esp + #8 L[2]=_ L[3]=esp + 
#4 L[4]=esp + #16 L[5]=esp + #20 L[6]=_ L[7]=_
         # AllocatedObj(0x03fbe9f4)

308   	INT3   ; ShouldNotReachHere
308
309   B40: #	N577 <- B5  Freq: 1e-006
309   	MOV    ECX,#-10
30e   	MOV    EBP,EDI
310   	MOV    [ESP + #4],EBX
314   	NOP 	# 3 bytes pad for loops and calls
317   	CALL,static  wrapper for: uncommon_trap(reason='null_check' 
action='maybe_recompile')
         # exp::foo @ bci:33  L[0]=_ L[1]=_ L[2]=_ L[3]=_ L[4]=_ L[5]=_ 
L[6]=_ L[7]=_ STK[0]=EBP STK[1]=esp + #4
         # AllocatedObj(0x03fbe9f4)

31c   	INT3   ; ShouldNotReachHere
31c
31d   B41: #	B48 <- B19  Freq: 2.3255e-005
31d   	# exception oop is in EAX; no code emitted
31d   	MOV    ECX,EAX
31f   	JMP,s  B48
31f
321   B42: #	B48 <- B16  Freq: 5.16829e-006
321   	# exception oop is in EAX; no code emitted
321   	MOV    ECX,EAX
323   	JMP,s  B48
323
325   B43: #	N577 <- B15  Freq: 1e-006
325   	MOV    ECX,#-10
32a   	MOV    EBP,EDI
32c   	MOV    [ESP + #4],ESI
330   	NOP 	# 3 bytes pad for loops and calls
333   	CALL,static  wrapper for: uncommon_trap(reason='null_check' 
action='maybe_recompile')
         # exp::foo @ bci:57  L[0]=_ L[1]=_ L[2]=_ L[3]=_ L[4]=_ L[5]=_ 
L[6]=_ L[7]=_ STK[0]=EBP STK[1]=esp + #4
         # AllocatedObj(0x03fbe9f4)

338   	INT3   ; ShouldNotReachHere
338
339   B44: #	B28 B45 <- B26 B27  Freq: 0.103388
339   	CMP    ESI,ECX
33b   	Jle    B28  P=0.500000 C=-1.000000
33b
341   B45: #	B50 B46 <- B31 B44  Freq: 0.103382
341   	CALL_LEAF,runtime  currentTimeMillis
         No JVM State Info
         #
346   	MOV    [ESP + #16],EAX
	MOV    [ESP + #20],EDX
34e   	MOV    EBP,#332
353   	MOV    EBP,[EBP + precise klass java/lang/System: 
0x00a06e88:Constant:exact *] ! Field java/lang/System.out
359   	TEST   EBP,EBP
35b   	Jeq,s  B50  P=0.000001 C=-1.000000
35b
35d   B46: #	N577 <- B45  Freq: 1e-006
35d   	MOV    ECX,#-20
362   	MOV    [ESP + #4],EBX
366   	NOP 	# 1 bytes pad for loops and calls
367   	CALL,static  wrapper for: uncommon_trap(reason='null_assert' 
action='make_not_entrant')
         # exp::foo @ bci:131  L[0]=_ L[1]=esp + #24 L[2]=_ L[3]=_ 
L[4]=esp + #4 L[5]=_ L[6]=esp + #16 L[7]=_ STK[0]=EBP
         # AllocatedObj(0x03fbe9f4)

36c   	INT3   ; ShouldNotReachHere
36c
36d   B47: #	B48 <- B30  Freq: 5.16894e-006
36d   	# exception oop is in EAX; no code emitted
36d   	MOV    ECX,EAX
36d
36f   B48: #	N577 <- B38 B42 B41 B47  Freq: 0.0340173
36f   	ADD    ESP,72	# Destroy frame
	POPL   EBP
	
373   	JMP    rethrow_stub
373
378   B49: #	N577 <- B29  Freq: 1e-006
378   	MOV    ECX,#-10
37d   	MOV    EBP,EDI
37f   	CALL,static  wrapper for: uncommon_trap(reason='null_check' 
action='maybe_recompile')
         # exp::foo @ bci:108  L[0]=_ L[1]=_ L[2]=_ L[3]=_ L[4]=_ L[5]=_ 
L[6]=_ L[7]=_ STK[0]=EBP STK[1]=esp + #16
         # AllocatedObj(0x03fbe9f4)

384   	INT3   ; ShouldNotReachHere
384
385   B50: #	N577 <- B45  Freq: 1e-006
385   	MOV    ECX,#11
38a   	MOV    EBP,EBX
38c   	NOP 	# 3 bytes pad for loops and calls
38f   	CALL,static  wrapper for: uncommon_trap(reason='unloaded' 
action='reinterpret' index='11')
         # exp::foo @ bci:131  L[0]=_ L[1]=esp + #24 L[2]=_ L[3]=_ 
L[4]=EBP L[5]=_ L[6]=esp + #16 L[7]=_ STK[0]=#NULL
         #
394   	INT3   ; ShouldNotReachHere
394


lopex
Technical Details
Message-ID: <gdnspv$mml$1@news.onet.pl>
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail
References: <gdg318$g5g$1@nemesis.news.neostrada.pl> <gdi32o$ea6$5@inews.gazeta.pl> <ae5fb5c3-6e37-48db-b305-6d251b347842@o40g2000prn.googlegroups.com> <gdi45f$ohu$1@inews.gazeta.pl> <ed72be02-c2b9-469d-a6b4-f53f5d7eda3a@w1g2000prk.googlegroups.com> <gdi51u$slu$1@inews.gazeta.pl> <248a2f73-1b18-47d4-83cf-5bd9899b37b4@i20g2000prf.googlegroups.com> <gdi736$8me$3@inews.gazeta.pl> <ea528cd6-ddb9-4f02-bd8d-813de51b4133@g17g2000prg.googlegroups.com> <gdimls$fpn$1@atlantis.news.neostrada.pl> <26ba6ecf-b028-4c46-b9c1-9238ed508cdd@v13g2000pro.googlegroups.com> <gdiq18$nrg$1@atlantis.news.neostrada.pl> <861b478a-95cc-4062-829c-ee5e144c6f0a@t39g2000prh.googlegroups.com> <gdj1qo$61e$1@nemesis.news.neostrada.pl> <1b9a2fd1-3d19-43e1-ad98-ce4387fb5c61@34g2000hsh.googlegroups.com> <48fe291a$1@news.home.net.pl> <deca15ae-9182-4236-a18a-419917183628@l62g2000hse.googlegroups.com>

Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.rmf.pl!agh.edu.pl!news.agh.edu.pl!news.onet.pl!not-for-mail
From: Marcin Mielżyński <lopx@gazeta.pl>
Newsgroups: pl.comp.lang.java
Subject: Re: Szybkość Javy wg Horstmanna a testy...
Date: Wed, 22 Oct 2008 20:52:46 +0200
Organization: Onet.pl
Lines: 655
Message-ID: <gdnspv$mml$1@news.onet.pl>
References: <gdg318$g5g$1@nemesis.news.neostrada.pl> <gdi32o$ea6$5@inews.gazeta.pl>  <ae5fb5c3-6e37-48db-b305-6d251b347842@o40g2000prn.googlegroups.com>  <gdi45f$ohu$1@inews.gazeta.pl> <ed72be02-c2b9-469d-a6b4-f53f5d7eda3a@w1g2000prk.googlegroups.com>  <gdi51u$slu$1@inews.gazeta.pl> <248a2f73-1b18-47d4-83cf-5bd9899b37b4@i20g2000prf.googlegroups.com>  <gdi736$8me$3@inews.gazeta.pl> <ea528cd6-ddb9-4f02-bd8d-813de51b4133@g17g2000prg.googlegroups.com>  <gdimls$fpn$1@atlantis.news.neostrada.pl> <26ba6ecf-b028-4c46-b9c1-9238ed508cdd@v13g2000pro.googlegroups.com>  <gdiq18$nrg$1@atlantis.news.neostrada.pl> <861b478a-95cc-4062-829c-ee5e144c6f0a@t39g2000prh.googlegroups.com>  <gdj1qo$61e$1@nemesis.news.neostrada.pl> <1b9a2fd1-3d19-43e1-ad98-ce4387fb5c61@34g2000hsh.googlegroups.com>  <48fe291a$1@news.home.net.pl> <deca15ae-9182-4236-a18a-419917183628@l62g2000hse.googlegroups.com>
NNTP-Posting-Host: chello089074154207.chello.pl
Mime-Version: 1.0
X-Trace: news.onet.pl 1224701567 23253 89.74.154.207 (22 Oct 2008 18:52:47 GMT)
X-Complaints-To: usenet@news.onet.pl
NNTP-Posting-Date: Wed, 22 Oct 2008 18:52:47 +0000 (UTC)
X-Sender: 5Da2qcG7AWj7WISFX859Php/OS6q4VnB
In-Reply-To: <deca15ae-9182-4236-a18a-419917183628@l62g2000hse.googlegroups.com>
User-Agent: Thunderbird 2.0.0.17 (Windows/20080914)
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit