Cpp dispatch benchmark
A few months ago, I came across this article on this subreddit:
Four Ways to Dispatch a Runtime-Selected Strategy in C++
Most articles on this topic discuss dispatching methods in isolation, focusing heavily on the implementation details of a single approach. However, I wanted to see the bigger picture—not just pitting virtual functions against switch statements, but measuring the actual performance footprint of each strategy in real-world scenarios.
This benchmark does not claim to be academic or to represent absolute truth; I was simply curious to compare fundamentally different approaches. That is why I included not only standard comparisons like virtual functions vs. CRTP, but also deeply nested virtual calls that deliberately stress the instruction cache and branch predictor.
The project is still a work in progress. Living in Ukraine, frequent power outages caused by shelling have significantly limited my available development time.
AI Disclosure: Did I use AI for this project? Yes. Benchmarks starting from #12 were suggested by an LLM, which also helped refine the AVX2 search routine and proofread my English.
You can read about Eytzinger’s binary search here: https://algorithmica.org/en/eytzinger
The benchmark results are here: https://github.com/HarrierDuBoisX/Cpp-dispatch-benchmark/blob/main/result.md
You can find the code itself here: https://github.com/HarrierDuBoisX/Cpp-dispatch-benchmark
7 comments · 63% upvoted · other discussions
I see you are using a recent msvc compiler on Windows. It would be interesting to see how this behaves with other compilers as well. Same for other platforms.
Why? Because different compilers optimize differently, so what might be better on one could be worse for the other. Different platforms are useful due to calling conventions, which also can have a measurable impact. (For example: On Linux string_view is passed via 2 registers why on Windows this is passed as a pointer)
Not saying you have to do this all yourself, though you should be aware of that. The easiest way to continue would be by installing LLVM and using clang-cl. Either from the website or an older version via the visual studio installer.
ChatFrais 2 points · 22h ago
Agree,
Library and compiler used have different way to optimise the same dispatch.
this small bench show gcc/llvm and msvc (in comment)
https://stackoverflow.com/questions/57726401/stdvariant-vs-inheritance-vs-other-ways-performance/65632611