[MUD-Dev] Re: Question on c++ switch optimization, and parsers in general.
Chris Gray
cg at ami-cg.GraySage.Edmonton.AB.CA
Mon Feb 8 20:29:46 CET 1999
[Richard Woolcock (KaVir):]
>I believe that switch statements are compiled down to the equivilent
>of if statements, ie:
>
> switch ( x )
> {
> case 1: ...
> case 2: ...
> case 3: ...
> default: ...
> }
>
>Is no more efficient than:
>
> if ( x == 1 ) ...
> else if ( x == 2 ) ...
> else if ( x == 3 ) ...
> else ...
>Some more modern compilers may treat switch statements better than
>the ones I'm used to - if so, I'd appreciate it if someone told me :)
Any compiler that still does that should be taken out and shot. Even
toy compilers do better. I very much doubt any commercial compiler will
do it. There are generally a small number of schemes that a compiler
will use to handle switch statements, depending on the density and
number of the index values. Some methods:
- emit an inline table containing offsets to the code to be executed.
Table is directly indexed by a multiple of the switch value,
usually with a range-test to handle the default. A variant is
to have branch instructions in the table, and to branch to
the appropriate one which then branches to the final code.
- emit an inline table containing index values and code offsets.
Either call a run-time routine, or emit an in-line binary
search to search the table. Similar alternate.
- emit a sequence of instructions that implement an inline binary
search of the index space directly, using inline constants.
- emit a sequence of instructions to do a simple linear search, much
as KaVir suggests. If the compiler does this for more than about
4 or 5 tests, however, it should be shot. This would be done when
the index values are such that, on average, this simple linear
search is the fastest method.
I'm sure I'm missing some - I found lots when I was writing disassemblers
about 10 years ago. I used the first and second in my Draco compiler,
and my AmigaMUD bytecode has those as well.
--
Don't design inefficiency in - it'll happen in the implementation. - me
Chris Gray cg at ami-cg.GraySage.Edmonton.AB.CA
http://www.GraySage.Edmonton.AB.CA/cg/
More information about the mud-dev-archive
mailing list