code.ivysaur.me

interpreter-binary-perf

Brief performance testing of binary/decimal conversion functions in different scripting interpreters.

Test conditions

Performed under bit noisy conditions (web browser + media player open, etc).

Each test was run 3x, reporting the best time

All tests are single-threaded.

cat /proc/cpuinfo | grep bogo | head -1
bogomips        : 6618.86

All packages are from Debian Buster except where indicated.

  • Perl v5.28.1
  • Python2 v2.7.16
  • Python3 v3.7.3
  • PHP v7.3.14-1
  • Node.js v10.20.1 (nodesource.com distribution)
  • Ruby v2.5.5p157

Raw loop performance

|Language |Time(real)|Command |-------------|----------|-------- |Perl5 |0m0.308s |time perl -e 'for($i = 0; $i < 10000000; ++$i) {}' |Python2 |0m0.502s |time python2 -c 'for i in range(10000000): pass' |Python3 |0m0.302s |time python3 -c 'for i in range(10000000): pass' |PHP |0m0.249s |time php -r 'for($i = 0; $i < 10000000; ++$i);' |Node.js ⭐ |0m0.075s |time node -e 'for(let i = 0; i < 10000000; ++i);' |Ruby |0m0.409s |time ruby -e 'for i in 0..10000000 ; end'

Binary to decimal

  • Use 511 as sample value to bypass 8-bit interning

|Language |Time(real)|Command |-------------|----------|-------- |Perl5 |0m4.745s |time perl -e 'for($i = 0; $i < 10000000; ++$i) { oct("0b" + "111111111") }' |Python2 |0m1.794s |time python2 -c 'for i in range(10000000): int("111111111", 2)' |Python3 |0m1.953s |time python3 -c 'for i in range(10000000): int("111111111", 2)' |PHP |0m13.146s |time php -r 'for($i = 0; $i < 10000000; ++$i) bindec("111111111");' |Node.js ⭐ |0m0.709s |time node -e 'for(let i = 0; i < 10000000; ++i) { parseInt("111111111", 2) }' |Ruby |0m1.313s |time ruby -e 'for i in 0..10000000 ; "111111111".to_i(2) ; end'

Decimal to binary

  • Use 257 as sample value to bypass small-integer interning

|Language |Time(real)|Command |-------------|----------|-------- |Perl5 ⭐ |0m0.367s |time perl -e 'for($i = 0; $i < 10000000; ++$i) { sprintf("%b", 257) }' |Python2 |0m1.519s |time python2 -c 'for i in range(10000000): bin(257)[2:]' |Python2 (alt)|0m2.697s |time python2 -c 'for i in range(10000000): "{:b}".format(257)' |Python3 |0m1.988s |time python3 -c 'for i in range(10000000): bin(257)[2:]' |Python3 (alt)|0m2.196s |time python3 -c 'for i in range(10000000): "{:b}".format(257)' |PHP |0m14.038s |time php -r 'for($i = 0; $i < 10000000; ++$i) decbin(257);' |Node.js |0m1.594s |time node -e 'for(let i = 0; i < 10000000; ++i) { (257).toString(2) }' |Ruby |0m1.706s |time ruby -e 'for i in 0..10000000 ; 257.to_s(2) ; end'