L1VM benchmark 04

I did run “the benchmark 4”, the double numbers adding loop on the new Python 3.11 and on my L1VM.

Here are the results:

$ time python3.11 double-test.py
python3.11 double-test.py  13,76s user 0,01s system 99% cpu 13,813 total


$ time lua double-test.lua 
lua double-test.lua  5,32s user 0,00s system 99% cpu 5,333 total


$ time node double-test.js
node double-test.js  3,19s user 0,04s system 97% cpu 3,301 total


$ time l1vm double-test -q 
l1vm double-test -q  5,92s user 0,01s system 99% cpu 5,946 total

Can we go faster? YESSS!!! Fasten your seatbelts!

$ time l1vm double-test-optimized -q
l1vm double-test-optimized -q  1,41s user 0,01s system 99% cpu 1,432 total

This is insane!!! It’s running in lightspeed.
My L1VM is running in interpreted mode without any JIT-compiler running!

Update I did add a new opcode in Brackets: (x load). It loads an int64 or double number into a register. This can be done before a JIT-compiler code block. The JIT-compiler can’t load/pull variables. So you can do it before such a code block. Here is the runtime of the JIT-compiled program:

time l1vm double-test-optimized-jit -q
l1vm double-test-optimized-jit -q  1,18s user 0,00s system 99% cpu 1,189 total

Here is the benchmark 04.

And for all who wanted to know how fast a C program is:

$ time ./double-test
./double-test  0,30s user 0,00s system 99% cpu 0,306 total

So my optimized Brackets program is about factor 4,7 slower than C.
Here is the normalized table:

language       | version | factor
C              |         |  1
L1VM JIT comp  | 2.0.5   |  4
L1VM optimized | 2.0.5   |  4.7
Node.js        | 19.0.0  | 10.6
Lua            | 5.4.4   | 17.7
L1VM           | 2.0.5   | 19.7
Python         | 3.11    | 45.9

There is also a JIT-compiled version with inline assembly in the ZIP archive: double-test-jit. It runs as fast as the C program. So you can write programs which are very fast in inline assembly.