Duktape 1.3.0 performance measurement

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
Last edited by Sami Vaarala, 2017-09-23 01:46:40