Duktape 1.3.0 performance measurement
Measurement host:
- "Intel(R) Core(TM) i7-4600U CPU @ 2.10GHz" laptop
Duktape is compiled with:
- gcc-4.8.4 (Ubuntu 14.04.3) on x64
gcc -O2
- debugger and interrupt executor support enabled
- fastints enabled
JSON.stringify()
fast path disabled
Note that:
These are microbenchmarks, and don't necessarily represent application performance very well. Microbenchmarks are useful for measuring how well different parts of the engine work.
Only relative numbers matter. Loop counts differ between test cases so the numbers for two tests are not directly comparable. Absolute numbers may also change between test runs if test target is different.
The measurement process is not very accurate: it's based on running the test multiple times and measuring time using the
time
command.
Performance summary
Testcase | duk 1.3.0 | duk 1.2.3 | duk 1.1.3 | rhino | lua 5.1 | python | perl | ruby |
---|---|---|---|---|---|---|---|---|
test-array-read.js | 4.13 | 5.62 | 7.96 | 0.99 | 1.19 | 5.64 | 5.34 | 4.41 |
test-array-write.js | 4.37 | 6.04 | 22.21 | 1.59 | 1.38 | 6.30 | 5.32 | 6.89 |
test-bitwise-ops.js | 0.85 | 1.11 | 5.06 | 8.41 | n/a | n/a | n/a | n/a |
test-buffer-nodejs-read.js | 4.61 | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
test-buffer-nodejs-write.js | 5.52 | n/a | n/a | n/a | n/a | n/a | n/a | n/a |
test-buffer-object-read.js | 4.62 | 21.63 | 25.47 | n/a | n/a | n/a | n/a | n/a |
test-buffer-object-write.js | 5.53 | 24.61 | 28.58 | n/a | n/a | n/a | n/a | n/a |
test-buffer-plain-read.js | 4.24 | 5.25 | 7.70 | n/a | n/a | n/a | n/a | n/a |
test-buffer-plain-write.js | 3.75 | 5.28 | 10.55 | n/a | n/a | n/a | n/a | n/a |
test-call-basic.js | 14.42 | 15.52 | 20.05 | 3.87 | 2.41 | 9.02 | 9.70 | 6.24 |
test-compile-mandel-nofrac.js | 13.21 | 16.52 | 18.38 | 7.54 | n/a | n/a | n/a | n/a |
test-compile-mandel.js | 16.32 | 19.49 | 21.45 | 7.58 | n/a | n/a | n/a | n/a |
test-compile-short.js | 10.17 | 9.91 | 11.07 | 4.11 | n/a | n/a | n/a | n/a |
test-const-load.js | 5.96 | 9.48 | 10.88 | 0.30 | 2.10 | 5.41 | 24.22 | 4.01 |
test-empty-loop.js | 2.33 | 3.10 | 5.73 | 0.66 | 0.94 | 4.50 | 3.40 | 3.30 |
test-fib.js | 8.57 | 9.39 | 9.77 | 1.22 | 1.32 | 2.39 | 6.39 | 1.51 |
test-global-lookup.js | 9.98 | 10.59 | 11.52 | 1.22 | n/a | n/a | n/a | n/a |
test-hello-world.js | 0.00 | 0.00 | 0.00 | 0.23 | 0.00 | 0.00 | 0.00 | 0.00 |
test-hex-decode.js | 5.30 | 5.30 | 9.30 | n/a | n/a | 12.33 | n/a | n/a |
test-hex-encode.js | 26.28 | 26.32 | 28.56 | n/a | n/a | 2.85 | n/a | n/a |
test-json-integer-parse.js | 0.41 | 0.42 | 0.41 | 1.07 | n/a | 0.07 | n/a | n/a |
test-json-number-parse.js | 5.09 | 4.98 | 5.23 | 1.58 | n/a | 0.29 | n/a | n/a |
test-json-serialize.js | 1.56 | 3.08 | 3.21 | 3.29 | n/a | 0.51 | n/a | n/a |
test-json-string-bench.js | 5.41 | 5.38 | 6.63 | 2.11 | n/a | n/a | n/a | n/a |
test-json-string-parse.js | 0.55 | 2.99 | 2.99 | 2.46 | n/a | n/a | n/a | n/a |
test-json-string-stringify.js | 1.23 | 3.53 | 3.50 | 6.15 | n/a | 0.48 | n/a | n/a |
test-prop-read.js | 7.58 | 8.48 | 12.00 | 1.07 | 1.24 | 6.17 | 6.86 | 14.56 |
test-prop-write.js | 6.95 | 7.75 | 11.47 | 2.14 | 1.42 | 6.49 | 6.91 | 18.21 |
test-reg-load.js | 2.75 | 4.29 | 5.29 | 0.30 | 2.25 | 5.70 | n/a | 4.04 |
test-reg-readwrite-object.js | 3.72 | 5.33 | 7.03 | 0.34 | 1.72 | 4.72 | 28.35 | 3.87 |
test-reg-readwrite-plain.js | 2.48 | 3.93 | 4.67 | 0.37 | 1.72 | 4.73 | 30.16 | 3.98 |
test-regexp-string-parse.js | 10.51 | 12.59 | 12.43 | n/a | n/a | 0.46 | n/a | n/a |
test-string-array-concat.js | 6.37 | 7.52 | 24.43 | 2.02 | 2.06 | 2.83 | 7.40 | 7.74 |
test-string-compare.js | 3.76 | 4.56 | 6.07 | 5.67 | 2.80 | 4.85 | 16.13 | 5.30 |
test-string-decodeuri.js | 3.54 | 4.10 | 4.02 | 1.91 | n/a | n/a | n/a | n/a |
test-string-encodeuri.js | 4.29 | 6.17 | 6.24 | 6.82 | n/a | n/a | n/a | n/a |
test-string-intern-match.js | 2.35 | 2.36 | 2.41 | n/a | n/a | n/a | n/a | n/a |
test-string-intern-miss.js | 2.51 | 2.54 | 2.76 | n/a | n/a | n/a | n/a | n/a |
test-string-plain-concat.js | 4.06 | 4.07 | 4.06 | 0.31 | 0.59 | 0.00 | 0.41 | 0.71 |
test-string-uppercase.js | 2.55 | 3.28 | 3.26 | 2.55 | n/a | 1.21 | n/a | n/a |
Raw results
for i in tests/perf/*.js; do \
printf '%-30s:' "`basename $i`"; \
printf ' duk.O2.130 %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min ./duk.O2.130 $i`"; \
printf ' duk.O2.123 %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min ./duk.O2.123 $i`"; \
printf ' duk.O2.113 %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min ./duk.O2.113 $i`"; \
printf ' rhino %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min rhino $i`"; \
printf ' lua %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min lua ${i%%.js}.lua`"; \
printf ' python %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min python ${i%%.js}.py`"; \
printf ' perl %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min perl ${i%%.js}.pl`"; \
printf ' ruby %5s' "`python util/time_multi.py --count 5 --sleep 10 --mode min ruby ${i%%.js}.rb`"; \
printf '\n'; \
done
test-array-read.js : duk.O2.130 4.13 duk.O2.123 5.62 duk.O2.113 7.96 rhino 0.99 lua 1.19 python 5.64 perl 5.34 ruby 4.41
test-array-write.js : duk.O2.130 4.37 duk.O2.123 6.04 duk.O2.113 22.21 rhino 1.59 lua 1.38 python 6.30 perl 5.32 ruby 6.89
test-bitwise-ops.js : duk.O2.130 0.85 duk.O2.123 1.11 duk.O2.113 5.06 rhino 8.41 lua n/a python n/a perl n/a ruby n/a
test-buffer-nodejs-read.js : duk.O2.130 4.61 duk.O2.123 n/a duk.O2.113 n/a rhino n/a lua n/a python n/a perl n/a ruby n/a
test-buffer-nodejs-write.js : duk.O2.130 5.52 duk.O2.123 n/a duk.O2.113 n/a rhino n/a lua n/a python n/a perl n/a ruby n/a
test-buffer-object-read.js : duk.O2.130 4.62 duk.O2.123 21.63 duk.O2.113 25.47 rhino n/a lua n/a python n/a perl n/a ruby n/a
test-buffer-object-write.js : duk.O2.130 5.53 duk.O2.123 24.61 duk.O2.113 28.58 rhino n/a lua n/a python n/a perl n/a ruby n/a
test-buffer-plain-read.js : duk.O2.130 4.24 duk.O2.123 5.25 duk.O2.113 7.70 rhino n/a lua n/a python n/a perl n/a ruby n/a
test-buffer-plain-write.js : duk.O2.130 3.75 duk.O2.123 5.28 duk.O2.113 10.55 rhino n/a lua n/a python n/a perl n/a ruby n/a
test-call-basic.js : duk.O2.130 14.42 duk.O2.123 15.52 duk.O2.113 20.05 rhino 3.87 lua 2.41 python 9.02 perl 9.70 ruby 6.24
test-compile-mandel-nofrac.js : duk.O2.130 13.21 duk.O2.123 16.52 duk.O2.113 18.38 rhino 7.54 lua n/a python n/a perl n/a ruby n/a
test-compile-mandel.js : duk.O2.130 16.32 duk.O2.123 19.49 duk.O2.113 21.45 rhino 7.58 lua n/a python n/a perl n/a ruby n/a
test-compile-short.js : duk.O2.130 10.17 duk.O2.123 9.91 duk.O2.113 11.07 rhino 4.11 lua n/a python n/a perl n/a ruby n/a
test-const-load.js : duk.O2.130 5.96 duk.O2.123 9.48 duk.O2.113 10.88 rhino 0.30 lua 2.10 python 5.41 perl 24.22 ruby 4.01
test-empty-loop.js : duk.O2.130 2.33 duk.O2.123 3.10 duk.O2.113 5.73 rhino 0.66 lua 0.94 python 4.50 perl 3.40 ruby 3.30
test-fib.js : duk.O2.130 8.57 duk.O2.123 9.39 duk.O2.113 9.77 rhino 1.22 lua 1.32 python 2.39 perl 6.39 ruby 1.51
test-global-lookup.js : duk.O2.130 9.98 duk.O2.123 10.59 duk.O2.113 11.52 rhino 1.22 lua n/a python n/a perl n/a ruby n/a
test-hello-world.js : duk.O2.130 0.00 duk.O2.123 0.00 duk.O2.113 0.00 rhino 0.23 lua 0.00 python 0.00 perl 0.00 ruby 0.00
test-hex-decode.js : duk.O2.130 5.30 duk.O2.123 5.30 duk.O2.113 9.30 rhino n/a lua n/a python 12.33 perl n/a ruby n/a
test-hex-encode.js : duk.O2.130 26.28 duk.O2.123 26.32 duk.O2.113 28.56 rhino n/a lua n/a python 2.85 perl n/a ruby n/a
test-json-integer-parse.js : duk.O2.130 0.41 duk.O2.123 0.42 duk.O2.113 0.41 rhino 1.07 lua n/a python 0.07 perl n/a ruby n/a
test-json-number-parse.js : duk.O2.130 5.09 duk.O2.123 4.98 duk.O2.113 5.23 rhino 1.58 lua n/a python 0.29 perl n/a ruby n/a
test-json-serialize.js : duk.O2.130 1.56 duk.O2.123 3.08 duk.O2.113 3.21 rhino 3.29 lua n/a python 0.51 perl n/a ruby n/a
test-json-string-bench.js : duk.O2.130 5.41 duk.O2.123 5.38 duk.O2.113 6.63 rhino 2.11 lua n/a python n/a perl n/a ruby n/a
test-json-string-parse.js : duk.O2.130 0.55 duk.O2.123 2.99 duk.O2.113 2.99 rhino 2.46 lua n/a python n/a perl n/a ruby n/a
test-json-string-stringify.js : duk.O2.130 1.23 duk.O2.123 3.53 duk.O2.113 3.50 rhino 6.15 lua n/a python 0.48 perl n/a ruby n/a
test-prop-read.js : duk.O2.130 7.58 duk.O2.123 8.48 duk.O2.113 12.00 rhino 1.07 lua 1.24 python 6.17 perl 6.86 ruby 14.56
test-prop-write.js : duk.O2.130 6.95 duk.O2.123 7.75 duk.O2.113 11.47 rhino 2.14 lua 1.42 python 6.49 perl 6.91 ruby 18.21
test-reg-load.js : duk.O2.130 2.75 duk.O2.123 4.29 duk.O2.113 5.29 rhino 0.30 lua 2.25 python 5.70 perl n/a ruby 4.04
test-reg-readwrite-object.js : duk.O2.130 3.72 duk.O2.123 5.33 duk.O2.113 7.03 rhino 0.34 lua 1.72 python 4.72 perl 28.35 ruby 3.87
test-reg-readwrite-plain.js : duk.O2.130 2.48 duk.O2.123 3.93 duk.O2.113 4.67 rhino 0.37 lua 1.72 python 4.73 perl 30.16 ruby 3.98
test-regexp-string-parse.js : duk.O2.130 10.51 duk.O2.123 12.59 duk.O2.113 12.43 rhino n/a lua n/a python 0.46 perl n/a ruby n/a
test-string-array-concat.js : duk.O2.130 6.37 duk.O2.123 7.52 duk.O2.113 24.43 rhino 2.02 lua 2.06 python 2.83 perl 7.40 ruby 7.74
test-string-compare.js : duk.O2.130 3.76 duk.O2.123 4.56 duk.O2.113 6.07 rhino 5.67 lua 2.80 python 4.85 perl 16.13 ruby 5.30
test-string-decodeuri.js : duk.O2.130 3.54 duk.O2.123 4.10 duk.O2.113 4.02 rhino 1.91 lua n/a python n/a perl n/a ruby n/a
test-string-encodeuri.js : duk.O2.130 4.29 duk.O2.123 6.17 duk.O2.113 6.24 rhino 6.82 lua n/a python n/a perl n/a ruby n/a
test-string-intern-match.js : duk.O2.130 2.35 duk.O2.123 2.36 duk.O2.113 2.41 rhino n/a lua n/a python n/a perl n/a ruby n/a
test-string-intern-miss.js : duk.O2.130 2.51 duk.O2.123 2.54 duk.O2.113 2.76 rhino n/a lua n/a python n/a perl n/a ruby n/a
test-string-plain-concat.js : duk.O2.130 4.06 duk.O2.123 4.07 duk.O2.113 4.06 rhino 0.31 lua 0.59 python 0.00 perl 0.41 ruby 0.71
test-string-uppercase.js : duk.O2.130 2.55 duk.O2.123 3.28 duk.O2.113 3.26 rhino 2.55 lua n/a python 1.21 perl n/a ruby n/a