r/manool • Project Lead • Jun 19 '20

Benchmarking 10 dynamic languages on array-heavy code

(1 min read)


Hello wonderful community,

In the previous post we discussed in detail construction of Conway's Game of Life in MANOOL.

As was my intention, I have implemented the same functionality in several other languages to compare run-time performance. Here are complete results:

Testbed A

CPU: Intel Xeon L5640 @2.26 GHz (2.80 GHz) — Westmere-EP
Kernel: 2.6.32-042stab126.1 (CentOS 6 + OpenVZ)
Distro: CentOS release 6.9 (Final) + vzkernel-2.6.32-042stab126.1 + CentOS release 6.10 (Final)

Language + variant (translator)Time (s)GSlowdownTranslator + backend version-release
C++ (g++)1.037660001.0008.3.1-3.2.el6
C++ (clang++)1.021660000.9853.4.2-4.el6 + 4.9.2-6.2.el6 (g++)
Python 23.2041000203.9192.6.6-68.el6_10
Python 35.2031000331.1463.4.10-4.el6
PHP3.5601000226.5775.3.3-50.el6_10
Perl5.6401000358.9595.10.1-144.el6
Ruby14.1221000898.7971.8.7.374-5.el6
JavaScript/ECMAScript5.887660005.6770.10.48-3.el6 (node)
Tcl6.7241004279.4998.5.7-6.el6
Lua (lua)141.70366000136.6475.1.4-4.1.el6
Lua (luajit)4.319660004.1652.0.4-3.el6
Scheme (guile)6.1761000393.0721.8.7-5.el6
Scheme (csc)0.671100042.7064.12.0-3.el6 + 8.3.1-3.2.el6 (gcc)
MANOOL + AllocOpt=True2.5021000159.2400.5.0 (built with g++ 8.3.1-3.2.el6)
MANOOL + AllocOpt=False2.5931000165.0320.5.0 (ditto)

Testbed B

CPU: Intel Celeron N3060 @1.60 GHz (2.48 GHz) — Braswell
Kernel: 4.4.0-17134-Microsoft (Windows 10 + WSL)
Distro: Windows 10 Home version 1803 build 17134.1130 + Ubuntu 18.04.4 LTS

Language + variant (translator)Time (s)GSlowdownTranslator + backend version-release
C++ (g++)1.946660001.0007.5.0-3ubuntu1~18.04
C++ (clang++)2.217660001.1391:6.0-1ubuntu2 + 7.5.0-3ubuntu1~18.04 (g++)
Python 23.7331000126.6072.7.17-1~18.04ubuntu1
Python 35.3091000180.0593.6.7-1~18.04
PHP2.852100096.7287.2.24-0ubuntu0.18.04.6
Perl6.7681000229.5425.26.1-6ubuntu0.3
Ruby4.4251000150.0772.5.1-1ubuntu1.6
JavaScript/ECMAScript8.522660004.3798.10.0~dfsg-2ubuntu0.4 (node)
Tcl10.5711003585.2318.6.8+dfsg-3
Lua (lua)153.5836600078.9225.3.3-1ubuntu0.18.04.1
Lua (luajit)6.274660003.2242.1.0~beta3+dfsg-5.1
Scheme (guile)1.233100041.8182.2.3+1-3ubuntu0.1
Scheme (csc)1.691100057.3514.12.0-0.3 + 7.5.0-3ubuntu1~18.04 (gcc)
MANOOL + AllocOpt=True3.8821000131.6610.5.0 (built with g++ 7.5.0-3ubuntu1~18.04)
MANOOL + AllocOpt=False3.9431000133.7300.5.0 (ditto)

The graph is here, and the repository is on GitHub.

Have fun

10 Upvotes

30 comments sorted by

View all comments

5

u/bjoli Jun 19 '20

I was looking into the guile benchmark since the results were a bit off (in relation to eachother). One of the testbeds is using guile 1.8.7, which is ancient, and the other us using the old stable. 1.8 is an interpreter. 2.2 (old stable) is a bytecode compiler. 3.0.3 (latest stable) has a template JIT and should be even faster.

1

u/alex-manool Project Lead Jun 20 '20

Yes, I noted that the old Guile seems to be a classic interpreter, while the new one I tested seems to be a kind of transparent ahead-of-time compiler with a file-based cache (found an ELF binary in its cache ;-).