DynamoRIO / DynamoRIO/dynamorio

improve slow decoder performance

Open
#1,050 0 comments 0 reactions 0 assignees View on GitHub
Component-IR Migrated Performance Priority-Medium Type-Feature
Dominant language
C
Stars
3.2k
Forks
629
Avg merge
2d 15h
Merged PRs (30d)
31

Description

_From [bruen...@google.com](https://code.google.com/u/109494838902877177630/) on January 09, 2013 14:21:08_

this is a general case for investigating and improving performance of decode().

xref issue #622 .

I took dis-udis86-randtest.raw and created a 200MB decoder test.

I modified api/dis.c to test perf using DR shared lib, and a new test decode_perf.c based on it but using the static decoder (and also tweaks to use underlying file i/o since DR i/o not available).

I'm pasting some data below.

Conclusions and action items:

static decoder lib is much faster than going through shared DR lib: 8.8x
faster!

instr_reset() call is costly (40% of the time spent there) for shared DR
lib, but not for static decoder lib => must just be inter-lib call and not
memset itself. so perhaps not worth coming up w/ a new model for instr
re-init (e.g., could have decode() clear the fields, which would avoid the
extra lib call).

ideas for faster full decode:
- reduce operand writing traffic to and from helper functions?

Raw data:

*\* DONE measure fast and slow decoders w/ DR shared lib
CLOSED: [2013-01-09 Wed 12:18]
- State "DONE" from "TODO" [2013-01-09 Wed 12:18]

all are 32-bit

decode_next_pc():
> bin32/runstats -env LD_LIBRARY_PATH /work/dr/git/exports/lib32/release suite/tests/bin/api.dis decode2M.raw
decoded 2092826 bytes
0:00.02elapsed 90%CPU 0.01user 0.00system (0major+334minor)pagefaults 0swaps
(2164 tot, 52 RSS, 156 data, 136 stk, 12 exe, 1832 lib)k

> bin32/runstats -env LD_LIBRARY_PATH /work/dr/git/exports/lib32/release suite/tests/bin/api.dis decode200M.raw
decoded 209282853 bytes
0:01.62elapsed 99%CPU 1.59user 0.02system (0major+335minor)pagefaults 0swaps
(135140 tot, 832 RSS, 131200 data, 416 stk, 12 exe, 3300 lib)k

decode():
> bin32/runstats -env LD_LIBRARY_PATH /work/dr/git/exports/lib32/release suite/tests/bin/api.dis decode2M.raw
decoded 2092826 bytes
0:01.21elapsed 99%CPU 0.66user 0.54system (0major+362minor)pagefaults 0swaps
(135140 tot, 1096 RSS, 131200 data, 416 stk, 12 exe, 3300 lib)k

> bin32/runstats -env LD_LIBRARY_PATH /work/dr/git/exports/lib32/release suite/tests/bin/api.dis decode200M.raw
decoded 209282662 bytes
2:01.03elapsed 99%CPU 66.65user 54.20system (0major+362minor)pagefaults 0swaps
(135140 tot, 1096 RSS, 131200 data, 416 stk, 12 exe, 3300 lib)k

decode() but no instr_reset() so not quite correct:
> bin32/runstats -env LD_LIBRARY_PATH /work/dr/git/exports/lib32/release suite/tests/bin/api.dis decode200M.raw
decoded 209282698 bytes
1:10.75elapsed 99%CPU 42.44user 28.08system (0major+413853minor)pagefaults 0swaps
(1722340 tot, 1652944 RSS, 1718400 data, 416 stk, 12 exe, 3300 lib)k

debug DR showing it's 2.8x slower:
> bin32/runstats -env LD_LIBRARY_PATH /work/dr/git/exports/lib32/debug suite/tests/bin/api.dis decode2M.raw

decoded 2092826 bytes
0:03.37elapsed 99%CPU 2.00user 1.36system (0major+424minor)pagefaults 0swaps
(137256 tot, 1356 RSS, 131208 data, 420 stk, 12 exe, 5348 lib)k

*\* DONE measure fast and slow decoders w/ static decoder lib
CLOSED: [2013-01-09 Wed 12:39]
- State "DONE" from "TODO" [2013-01-09 Wed 12:39]

in /work/dr/git/build_x86_rel_tests

decode_next_pc():
> bin32/runstats suite/tests/bin/api.decode_perf decode200M.raw
decoded 209282694 bytes
0:01.46elapsed 99%CPU 1.42user 0.03system (0major+267minor)pagefaults 0swaps
(2752 tot, 584 RSS, 52 data, 412 stk, 236 exe, 2008 lib)k

decode():
> bin32/runstats suite/tests/bin/api.decode_perf decode2M.raw
decoded 2092826 bytes
0:00.14elapsed 98%CPU 0.14user 0.00system (0major+305minor)pagefaults 0swaps
(2028 tot, 60 RSS, 24 data, 136 stk, 8 exe, 1832 lib)k

> bin32/runstats suite/tests/bin/api.decode_perf decode200M.raw
decoded 209368578 bytes
0:13.82elapsed 99%CPU 13.76user 0.03system (0major+206minor)pagefaults 0swaps
(2608 tot, 324 RSS, 184 data, 136 stk, 236 exe, 2008 lib)k

decode() but no instr_reset() so not quite correct:
> bin32/runstats suite/tests/bin/api.decode_perf decode200M.raw
decoded 209282694 bytes
0:13.00elapsed 98%CPU 12.26user 0.60system (0major+541044minor)pagefaults 0swaps
(2112588 tot, 2110476 RSS, 2109888 data, 412 stk, 236 exe, 2008 lib)k

decode() on windows (kraken):
% bin32/drrun -stats -noinject suite/tests/bin/api.decode_perf.exe D:/derek/dr/git/build_x86_rel_tests/decode200M.raw
decoded 209370189 bytes
0:20.00elapsed 99%CPU
(13152 tot, 3652 RSS, 18 paged, 4 non, 2244 swap)k

#define DR_FAST_IR 1 => no difference, as expected

_Original issue: http://code.google.com/p/dynamorio/issues/detail?id=1050_

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.