If statements vs case

Richard Gaskin ambassador at fourthworld.com
Mon Feb 26 12:35:28 EST 2007


Mark Smith wrote:
> I just ran a very simple benchmark test, which suggests that if/then  
> goes about 20% faster than switch/case.

I get different results here, but I had to rewrite the if-then test as 
the example posted as it wasn't executing the same logic as the switch 
block.  In the "if" example the "c" case didn't fall through to also 
execute the "d" case as it did in the "switch" example, and the "e" case 
wasn't handled at all.

So I wrote a fresh pair of examples that test all possible cases, 
running each full set 10000 iterations. They each produce the same 
logical result at this point, with these times on my MacBook Pro:

if:89ms switch:74ms
if result:140000 switch result:140000

The timings aren't surprising given the extra evaluations needed to get 
the same effect using "if" as with the "switch" fall-through behavior.

Please double-check the benchmark handler below to make sure that both 
tests are using equivalent logic, and look for ways the "if-then" might 
be better optimized:



local sResult

on mouseUp
   -- number of test iterations:
   put 10000 into n
   -- load var with all possible values:
   put "abcde" into s
   --
   --
   -- TEST 1: if-then
   put 0 into sResult
   put the millisecs into t
   repeat n
     --
     repeat for each char tVar in s
     If tVar ="a" or tVar ="b" then
         DoThing1
       else if tVar = "c" or tVar = "d" then
         if tVar = "c" then
           DoThing2
         end if
         DoThing3
       Else If tVar ="e" then
         DoThing4
       End if
     end repeat
     --
   end repeat
   put the millisecs - t into t1
   put sResult into tResult1
   --
   -- TEST 2: switch
   put 0 into sResult
   put the millisecs into t
   repeat n
     --
     repeat for each char tVar in s
       switch tVar
       case "a"
       case "b"
         DoThing1
         break
       case "c"
         DoThing2
       case "d"
         DoThing3
         break
       case "e"
         DoThing4
       end switch
     end repeat
     --
   end repeat
   put the millisecs - t into t2
   put sResult into tResult2
   --
   -- show results:
   put "if:"&t1 &"ms"&&"switch:"& t2&"ms"&cr&\
  "if result:"& tResult1 &&"switch result:"&tResult2
end mouseUp



on DoThing1
   add 1 to sResult
end DoThing1

on DoThing2
   add 2 to sResult
end DoThing2

on Dothing3
   add 3 to sResult
end Dothing3

on DoThing4
   add 4 to sResult
end DoThing4




-- 
  Richard Gaskin
  Managing Editor, revJournal
  _______________________________________________________
  Rev tips, tutorials and more: http://www.revJournal.com



More information about the use-livecode mailing list