On Friday, 1 June 2018 at 21:18:25 UTC, IntegratedDimensions wrote:
What is the best optimizations that a compiler does to switches in general and in the D compilers?

The best possible depends a lot on the specific case at hand. Best possible is to fully elide the switch, which does happen.

You can use d.godbolt.org to investigate what happens for different pieces of code.
Sometimes a jumptable is used, sometimes an if-chain.
LLVM's (LDC) and GCC's (GDC) optimizers are strong and the optimized code will often do extra calculations before indexing in the table or before doing the comparisons in the if-chain. Different compilers will make different optimizations.

https://godbolt.org/g/pHptff
https://godbolt.org/g/AwZ69o

A switch can be seen as if statements, or safer, nested if elses.

but surely the cost per case does not grow with depth in the switch? If one has a switch of N case then the last cost surely does not cost N times the cost of the first, approximately?

Depends on the code, but it's not O(N).

This is the cost when implementing a switch as nested ifs.

Not true. Nested if's are optimized as well. Sometimes switch is faster, sometimes if-chain, sometimes it's the same.

Tables can be used to give O(1) cost, are these used in D's compilers?

Yes (LDC and GDC).

How are they generally implemented? Hash tables? If the switch is on an enum of small values is it optimized for a simple calculating offset table?

Table stored in the instruction stream. Simple offset table with calculation on the index value (I guess you could say it is a simplified hash table).

Note that with performance, the rest of the program and the execution flow also matters...

cheers,
  Johan

Reply via email to