On Sun, 3 May 1998, Chris Powell wrote: > WHich is quicker > if (this == that || this == that2) > or > switch (this) { > case that: > case that2: It's probably a miniscule difference - it is not something you should worry about unless you find out that your program DOES run too slow. Premature optimization can end up giving clarity. If it's only 2-3 items, the if might be nicer, especially if it is the same code that is to be executed in all cases. With gcc, -O2, the following code (Intel machine) int test1 (int a) { if (a == 2 || a == 3) return 1; } int test2 (int a) { switch(a) { case 2: case 3: return 1; } } 08048538 <test1>: 8048538: 55 pushl %ebp 8048539: 89 e5 movl %esp,%ebp 804853b: 8b 45 08 movl 0x8(%ebp),%eax 804853e: 83 c0 fe addl $0xfffffffe,%eax 8048541: 83 f8 01 cmpl $0x1,%eax 8048544: 77 05 ja 804854b <test1+13> 8048546: b8 01 00 00 00 movl $0x1,%eax 804854b: 89 ec movl %ebp,%esp 804854d: 5d popl %ebp 804854e: c3 ret 804854f: 90 nop 08048550 <test2>: 8048550: 55 pushl %ebp 8048551: 89 e5 movl %esp,%ebp 8048553: 8b 45 08 movl 0x8(%ebp),%eax 8048556: 83 f8 03 cmpl $0x3,%eax 8048559: 7f 0a jg 8048565 <test2+15> 804855b: 83 f8 02 cmpl $0x2,%eax 804855e: 7c 05 jl 8048565 <test2+15> 8048560: b8 01 00 00 00 movl $0x1,%eax 8048565: 89 ec movl %ebp,%esp 8048567: 5d popl %ebp 8048568: c3 ret 8048569: 8d 76 00 leal 0x0(%esi),%esi Yep, I suppose the assembly code speaks for itself :P In this case, it seems the if is reduced to just one compare and jump, while the switch has two compares and jumps. That will be about one microsecond's difference :) The time wasted by disassembling your code like this however, is I think far more than it taken if you just pick the code that is more legible. I.e. if you have 6 different cases, a switch might look better, If you want some of the cases to drop through, a switch is much clearer. If you have just 2-3 different choices an if might be enough. But usually, trying to optimize for the compiler does not do much good (e.g. doing var >>=2 rather than var /= 4). Things that the compiler is less likely to get right that you might optmize for are something like moving constant parts out of loops, e.g.: const char *string = "some value that will not change"; for (int i = 0; i < 10000; i++) number += strlen (string) * 42; And more importantly, algorithms. ============================================================================= Erwin Andreasen Herlev, Denmark <erwin@pip.dknet.dk> UNIX System Programmer <URL:http://www.abandoned.org/drylock/> <*> (not speaking for) DDE ============================================================================= +------------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://democracy.queensu.ca/~fletcher/Circle/list-faq.html | +------------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/15/00 PST