This benchmark has been misleading for a while. It was originally made to demonstrate how JIT compilers can do all sorts of crazy stuff to your code - especially LuaJIT - and was meant to be a starting point of discussion about what exactly LuaJIT does and how.
As a result, its not indicative of what its performance may be on more realistic data. Differences can be expected because
- the text will not consist of hard-coded constants
- the number of words (and therefore the dictionary) would be larger, and JIT compilers for JS and Lua often have special optimizations for small dictionaries/tables
- the words wont be pre-split, and allocating new words adds significant performance penalty (in that case a trie would probably outperform other approaches)
To offset the effect of startup time we can multiply the times by 10x in which case we get (with the updated JS version):
luajit: 0.76s
C++: 3.35s
C: 1.44s
JS (with Map): 3.00s
It seems like only luajit is doing super-clever (unrealistic) optimizations at this point 😀