4 ms·
I googled and found a test[1]. Running this test with a few modifications (like removing unused variables and using PRIu64 instead of %llu) and disregarding the
by sebcat 8y ago
I googled and found a test[1]. Running this test with a few modifications (like removing unused variables and using PRIu64 instead of %llu) and disregarding the last two prints, I get:
switch = 5589926
goto = 5752079
goto_opt = 5618938
with -O0, and
switch = 2234105
goto = 2013742
goto_opt = 2016200
with -O2.
EDIT:
Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
[1] https://gist.github.com/mmozeiko/7cc858985b57df30eebbf8c6e75ef624 https://gist.github.com/mmozeiko/7cc858985b57df30eebbf8c6e75...
- vardump 8y agoWow, you were quick. Mentioning compiler name + version and exact CPU model would be nice. The difference is small enough that those details can tip the scales.
- sebcat 8y agoIntel(R) Core(TM) i7-6700 CPU @ 3.40GHz gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
- tom_mellior 8y agoIf you're looking for a bigger and more "real-world" test, the Python interpreter can be built with or without computed gotos for dispatch. It suffices to arrange to define USE_COMPUTED_GOTOS to 0 in Python/ceval.c. You can just change the file by hand, but I vaguely remember there also being a configure flag for setting USE_COMPUTED_GOTOS or HAVE_COMPUTED_GOTOS. Then run your favorite Python benchmark. For reasonable results, it must be one that spends almost all of its time in Python code, which excludes calls to native code libraries, but also Python programs that mostly do list manipulation like the popular fannkuch benchmark. (The list operations are implemented in C, and fannkuch, although looking like a Python program, spends most of its time in this C library.)
- rurban 8y agoThe only difference between the computed goto and the switch is that the computed goto leaves out the initial range check. But are doing simple and costly indirect jumps. Much better is to keep the ops small (16bit in this case which is the best I've seen, lua/luajit/chez have 32bit, worse languages 3-5 words) to have much more ops in the icache, and to pass around the ptr to the next op, best if relative. Easy with a small jit. This ptr will be prefetched, which is not possible with those indirect jumps, from cgo or switch.