As I promised I made some tests to compare switch statement and a map to functions. As I expected a map to functions works faster. Furthermore it doesn't depend on the amount of 'switch' conditions. I made a synthetic test:
unsigned long func(unsigned long acc) { return acc*acc; } #define SWITCH typedef unsigned long (*fd)(unsigned long); int main(int argc, char **argv) { unsigned long i, acc = 0; #ifndef SWITCH fd f[15] = {func,func,func,func,func,func,func,func,func,func,func,func,func,func,func}; #endif for (i=0;i<1000000000;++i) { #ifdef SWITCH switch (i%15) { case 0: acc = func(acc + i); break; case 1: acc = func(acc + i); break; case 2: acc = func(acc + i); break; case 3: acc = func(acc + i); break; case 4: acc = func(acc + i); break; case 5: acc = func(acc + i); break; case 6: acc = func(acc + i); break; case 7: acc = func(acc + i); break; case 8: acc = func(acc + i); break; case 9: acc = func(acc + i); break; case 10: acc = func(acc + i); break; case 11: acc = func(acc + i); break; case 12: acc = func(acc + i); break; case 13: acc = func(acc + i); break; case 14: acc = func(acc + i); break; } #else acc = f[i%15](acc + i); #endif } return 0; }Times w/o switch:
$for i in 1 2 3; do time ./a.out; done real 0m11.114s user 0m10.973s sys 0m0.010s real 0m10.968s user 0m10.966s sys 0m0.007s real 0m10.904s user 0m10.899s sys 0m0.003sand w/ switch
$for i in 1 2 3; do time ./a.out; done real 0m12.378s user 0m12.399s sys 0m0.000s real 0m12.410s user 0m12.413s sys 0m0.013s real 0m12.417s user 0m12.423s sys 0m0.010sA map to functions wins ~1 sec. That's not that much but if you are building a state machine with a lot of states it's better to use mapping rather than switch.
1 comment:
Switch/case are at least as fast as function arrays. Your example isn't relevant because you're using the same function for the entire array.
Post a Comment