[Python-Dev] Dynamic bytecode analysis
Damien Morton
newsgroups1@bitfurnace.com
Wed, 26 Feb 2003 19:55:22 -0500
So I enhanced the PVM dynamic execution profiler to keep track of quads of
instructions rather than just pairs. Running it on PyStone, I get the
following results:
Note: score is frequency * len(trace)
http://www.bitfurnace.com/python/dxstats-traces.txt
score trace
7204142 LOAD_FAST
3701796 LOAD_FAST, LOAD_FAST
3453243 COMPARE_OP, JUMP_IF_FALSE, POP_TOP
2701110 LOAD_GLOBAL
2603086 JUMP_IF_FALSE, POP_TOP
2402196 COMPARE_OP, JUMP_IF_FALSE
2302782 LOAD_CONST
2251111 STORE_FAST
2200676 LOAD_GLOBAL, COMPARE_OP, JUMP_IF_FALSE, POP_TOP
2101580 LOAD_FAST, LOAD_CONST
2100896 STORE_FAST, LOAD_FAST
2000188 COMPARE_OP, JUMP_IF_FALSE, POP_TOP, LOAD_GLOBAL
1800639 LOAD_FAST, LOAD_CONST, BINARY_ADD
1650507 LOAD_GLOBAL, COMPARE_OP, JUMP_IF_FALSE
1650177 JUMP_IF_FALSE, POP_TOP, LOAD_GLOBAL
1600986 LOAD_GLOBAL, LOAD_FAST
1600492 LOAD_FAST, LOAD_GLOBAL, COMPARE_OP, JUMP_IF_FALSE
1500536 LOAD_CONST, BINARY_ADD
1500339 STORE_FAST, LOAD_FAST, LOAD_FAST
1500282 LOAD_FAST, STORE_ATTR
1452043 POP_TOP
1400524 LOAD_FAST, LOAD_CONST, BINARY_ADD, STORE_FAST
1400056 LOAD_FAST, LOAD_FAST, BINARY_SUBSCR, LOAD_FAST
1351596 JUMP_IF_FALSE
1300164 POP_TOP, LOAD_GLOBAL
1251127 COMPARE_OP
1203536 COMPARE_OP, JUMP_IF_FALSE, POP_TOP, LOAD_FAST
...
certainly, making JUMPs consume the top-of-stack still seems worthwhile
other possibilities
LOAD_FAST+FAST == LOAD_FAST, LOAD_FAST
JUMP_IF_CMP == COMPARE_OP, JUMP_IF_FALSE -- consumes two items off the stack
LOAD_FAST+CONST == LOAD_FAST, LOAD_CONST
ADD_CONST == LOAD_CONST, BINARY_ADD
FAST_SUBSCR == LOAD_FAST, LOAD_FAST, BINARY_SUBSCR
If anyone has any suggestions of a better app than PyStone to profile, I
would be grateful.