Re: [dev] startup time of some interpreters

From: Hadrien Lacour <hadrien.lacour_AT_posteo.net>
Date: Thu, 20 Feb 2020 19:07:04 +0100

On Thu, Feb 20, 2020 at 12:22:53PM -0500, Greg Reagle wrote:
> Hello. I am amazed at how fast Lua is to start up and shut down. Is my benchmark defective in any way? Lua seems to start up and exit faster than bash, python, rc, and ksh. Dash and mksh are faster. These interpreters are all packages from Debian Stable 10 "Buster".
>
> /usr/bin/time sh -c 'for i in $(seq 1 200); do dash -c "echo \"hello\""; done' > /dev/null
> 0.12user 0.04system 0:00.17elapsed 97%CPU (0avgtext+0avgdata 1728maxresident)k
> 0inputs+0outputs (0major+16728minor)pagefaults 0swaps
>
> /usr/bin/time sh -c 'for i in $(seq 1 200); do mksh -c "echo \"hello\""; done' >
> /dev/null
> 0.16user 0.05system 0:00.23elapsed 96%CPU (0avgtext+0avgdata 1904maxresident)k
> 0inputs+0outputs (0major+18472minor)pagefaults 0swaps
>
> /usr/bin/time sh -c 'for i in $(seq 1 200); do lua -e "print \"hello\""; done' >
> /dev/null
> 0.22user 0.07system 0:00.31elapsed 97%CPU (0avgtext+0avgdata 2496maxresident)k
> 0inputs+0outputs (0major+25334minor)pagefaults 0swaps
>
> /usr/bin/time sh -c 'for i in $(seq 1 200); do bash -c "echo \"hello\""; done' > /dev/null
> 0.26user 0.09system 0:00.36elapsed 96%CPU (0avgtext+0avgdata 3240maxresident)k
> 0inputs+0outputs (0major+30253minor)pagefaults 0swaps
>
> /usr/bin/time sh -c 'for i in $(seq 1 200); do ksh -c "echo \"hello\""; done' > /dev/null
> 0.28user 0.14system 0:00.44elapsed 95%CPU (0avgtext+0avgdata 3888maxresident)k
> 0inputs+0outputs (0major+37146minor)pagefaults 0swaps
>
> /usr/bin/time sh -c 'for i in $(seq 1 200); do /usr/lib/plan9/bin/rc -c "echo \"hello\""; done' > /dev/null
> 0.43user 0.14system 0:00.60elapsed 96%CPU (0avgtext+0avgdata 2008maxresident)k
> 0inputs+0outputs (0major+43700minor)pagefaults 0swaps
>
> /usr/bin/time sh -c 'for i in $(seq 1 200); do python -c "print \"hello\""; done' > /dev/null
> 2.32user 0.88system 0:03.32elapsed 96%CPU (0avgtext+0avgdata 7220maxresident)k
> 0inputs+0outputs (0major+174760minor)pagefaults 0swaps
>

Why would it be "defective" other than sh or I/O adding time noise? lua is a
very simple language with a light reference interpreter. You should consider
tcl (through jimsh) too, I find this language way more elegant than these.

hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do busybox ash -c "echo \"hello\""; done' > /dev/null
0.05s
hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do bash -c "echo \"hello\""; done' > /dev/null
0.13s
hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do python2 -c "print \"hello\""; done' > /dev/null
1.55s
hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do python3 -c "print(\"hello\")"; done' > /dev/null
2.72s
hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do perl -e "print \"hello\n\""; done' > /dev/null
0.17s
hadrien_AT_gentoo-zen2700x> printf '%s\n' '#!/usr/bin/tclsh' 'puts hello' >hello.tcl
hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do ./hello.tcl; done' > /dev/null
0.39s
hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do jimsh -e "puts hello"; done' > /dev/null
0.18s
hadrien_AT_gentoo-zen2700x> time sh -c 'for i in $(seq 1 200); do lua -e "print \"hello\""; done' > /dev/null
0.11s

What it shows is that python is slower than a dead rat and the reference tcl
could be better. Apart from that, they're all quite fast.
A much more accurate mesure of disgust is the number of syscall made for such a
simple task:

hadrien_AT_gentoo-zen2700x> strace -fc busybox ash -c 'echo hello' 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
26
hadrien_AT_gentoo-zen2700x> strace -fc bash -c 'echo hello' 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
132
hadrien_AT_gentoo-zen2700x> strace -fc python2 -c 'print "hello"' 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
683
hadrien_AT_gentoo-zen2700x> strace -fc python3 -c 'print("hello")' 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
517
hadrien_AT_gentoo-zen2700x> strace -fc perl -e 'print("hello\n");' 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
173
hadrien_AT_gentoo-zen2700x> strace -fc ./hello.tcl 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
190
hadrien_AT_gentoo-zen2700x> strace -fc jimsh -e 'puts hello' 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
78
hadrien_AT_gentoo-zen2700x> strace -fc lua -e 'print "hello"' 2>&1 >/dev/null | tail -n1 | awk '{print $3}'
90

Speaks for itself.
Received on Thu Feb 20 2020 - 19:07:04 CET

This archive was generated by hypermail 2.3.0 : Thu Feb 20 2020 - 19:12:08 CET