News for hackers. Stuff that matters.
Re:Lua Doesn't Suck – Strange Loop 2010 20-minute talk video by avar on Sunday October 17, 2010 @10:05AM (#1800332)
You're right about one thing. That is very unscientific. You're mainly testing your file system cache, not these programming language implementations.

E.g. perl(1) is faster than ruby(1) at printing "Hello, world!". But since you presumably had ruby hot in cache and not perl the latter seems to be almost 4 times as slow.

Here's a better benchmark, which runs each of these 500 times and takes the average: http://gist.github.com/630868

Which yields these results:

               Rate clojure   php emacs python  ruby   js perl  awk  lua shell     C
    clojure 0.844/s      --  -97%  -97%   -98%  -99% -99% -99% -99% -99%  -99% -100%
    php      24.6/s   2812%    --   -2%   -43%  -75% -76% -78% -82% -82%  -84%  -89%
    emacs    25.2/s   2882%    2%    --   -41%  -74% -75% -78% -81% -82%  -84%  -88%
    python   43.0/s   4995%   75%   71%     --  -56% -58% -62% -68% -69%  -72%  -80%
    ruby     96.7/s  11361%  294%  284%   125%    --  -5% -15% -28% -29%  -38%  -55%
    js        101/s  11919%  313%  303%   136%    5%   -- -11% -24% -26%  -35%  -53%
    perl      114/s  13397%  364%  353%   165%   18%  12%   -- -15% -17%  -27%  -47%
    awk       134/s  15743%  444%  431%   211%   38%  32%  17%   --  -2%  -14%  -38%
    lua       137/s  16134%  458%  444%   219%   42%  35%  20%   2%   --  -12%  -36%
    shell     156/s  18359%  534%  519%   262%   61%  54%  37%  17%  14%    --  -28%
    C         216/s  25440%  777%  756%   401%  123% 113%  89%  61%  57%   38%    --
Update: Added a C program and ran the shell program in a sub-shell (since perl's system function preloads a shell). Didn't add silentbicycle's SWI Prolog and OCaml since he didn't provide the source.
Re:Lua Doesn't Suck – Strange Loop 2010 20-minute talk video by silentbicycle on Sunday October 17, 2010 @10:29AM (#1800396)
What we're essentially measuring here is runtime startup and (in some cases) byte-compiling.

           Rate python swipl ruby perl  lua luac bash ocaml  awk subshell ocamlopt    c py_pyc shell
    python   46.3/s     --  -17% -56% -70% -76% -78% -78%  -79% -83%     -87%     -88% -88%   -90%  -92%
    swipl    55.9/s    21%    -- -46% -63% -70% -73% -73%  -74% -80%     -84%     -85% -86%   -88%  -90%
    ruby      104/s   125%   86%   -- -31% -45% -49% -51%  -52% -62%     -71%     -72% -74%   -79%  -82%
    perl      152/s   229%  172%  46%   -- -20% -26% -28%  -30% -44%     -57%     -60% -61%   -69%  -74%
    lua       189/s   309%  239%  82%  25%   --  -8% -10%  -13% -31%     -47%     -50% -52%   -61%  -67%
    luac      206/s   345%  268%  98%  35%   9%   --  -2%   -6% -25%     -42%     -46% -48%   -58%  -64%
    bash      211/s   356%  277% 103%  39%  11%   3%   --   -3% -23%     -41%     -44% -46%   -57%  -63%
    ocaml     218/s   372%  290% 110%  44%  15%   6%   3%    -- -20%     -39%     -42% -45%   -55%  -62%
    awk       273/s   491%  389% 162%  80%  44%  33%  30%   25%   --     -23%     -28% -31%   -44%  -52%
    subshell  357/s   672%  539% 243% 135%  89%  74%  69%   64%  31%       --      -6%  -9%   -26%  -38%
    ocamlopt  379/s   719%  577% 264% 149% 100%  84%  80%   73%  39%       6%       --  -4%   -22%  -34%
    c         394/s   751%  604% 278% 159% 108%  91%  87%   80%  44%      10%       4%   --   -19%  -31%
    py_pyc    485/s   950%  768% 366% 219% 156% 136% 130%  122%  78%      36%      28%  23%     --  -16%
    shell     575/s  1143%  928% 452% 278% 203% 179% 172%  163% 110%      61%      52%  46%    18%    --
I added hello world programs for C, SWI Prolog, and OCaml (byte and native compilers). Timings on OpenBSD/amd64.

Edit: Since you can precompile Lua, I added that as 'luac'. It's not usually done, since Lua compiles VERY quickly, and the source is more portable. It's a data point, though. I also added a .pyc for Python - Python byte-compiles more slowly. There's little difference between lua and luac, but the difference between python and py_pyc is huge.

I also added shell with a new subshell, both sh and bash. And, source, as requested.

OCaml:

    let _ = print_string "Hello world.\n"
Compile with "ocamlc -o ochello foo.ml" for bytecode, "ocamlopt -o ochello.opt foo.ml" for native.

SWI Prolog:

    swipl => sub { system qq[swipl -g "write('Hello world.\n')." -t "halt."] },
luac:

    print "Hello, world."
And then compile with "luac hellow.lua", run as "lua luac.out".