BBC BASIC for Windows
Programming >> BBC BASIC language >> Another cunning use of the CASE statement?
http://bb4w.conforums.com/index.cgi?board=language&action=display&num=1238318456

Another cunning use of the CASE statement?
Post by Michael Hutton on Mar 29th, 2009, 09:20am

HI all,

I was wondering what was the quickest way to search a small unordered list of strings for a match and was wondering how fast the CASE statement was. I tried with fifty random strings and found the CASE statement about 5-6 time quicker. So I suppose if you have the inclination to type out an array you already know the contents of this could be slightly quicker (eg FNdetokenise) but then I haven't measured it against a binary chop for an ordered array.

I realise there is probably a very insignificant advantage in 'real life' situations.

I hope I haven't made any glaring errors as per usual..

(after thought) There is probably a WHILE...ENDWHILE construct which is slightly faster than the REPEAT...UNTIL...
Code:
    REM Which is faster?
      REM checking against an array or in an unrolled case statement
      DIM A$(50)
      FOR I%=1 TO 50
        READ A$(I%)
      NEXT
      
      T%=10000
      REM Test 1
      T=TIME
      FOR J%=1 TO T%
        R%=RND(5)
        IF R%=1 THEN B$=A$(RND(50)) ELSE B$="Dummy"
        F%=FALSE
        C%=1
        REPEAT
          IF B$=A$(C%) THEN F%=TRUE
          C%+=1
        UNTIL C%=51 OR F%=TRUE
      NEXT
      TT=TIME-T
      PRINT TT
      
      T=TIME
      FOR J%=1 TO T%
        R%=RND(5)
        IF R%=1 THEN B$=A$(RND(50)) ELSE B$="Dummy"
        F%=FALSE
        CASE B$ OF
          WHEN  "ASDKJASD","ASDOIJASD","ASDOJASD","EGIJUNGR","NFROIN","IJNUVF","IJNSDC","IJNCWEC","IOEWNCF",  \
            \   "OIJDF","SF","ERGFEWRF","WSEF","H","RFGTH","SDFS","F","EGTRERG","SDFVSDF","ERFWEF","SDF","ERFWEFR","SD",  \
            \   "jdfsdf","sdf","wef","wefwffewfw","ebgdgtbr","tyhtyh","sdcsdc","rftger","wscsdc","dervwe","csd","cer",    \
            \   "sadko","sweoijnwe","efjwne","edkjwen","ewdkjwedoiwed","ewweidw","e","erwgt","rth","ws","fsadfsdf","sd",  \
            \   "dsf","asdf","asdfasdf"
            F%=TRUE
          OTHERWISE:
        ENDCASE
      NEXT
      TT=TIME-T
      PRINT TT
      
      DATA ASDKJASD,ASDOIJASD,ASDOJASD,EGIJUNGR,JNFROIN,IJNUVF,IJNSDC,IJNCWEC,IOEWNCF
      DATA OIJDF,SF,ERGFEWRF,WSEF,H,RFGTH,SDFS,F,EGTRERG,SDFVSDF,ERFWEF,SDF,ERFWEFR,SD
      DATA jdfsdf,sdf,wef,wefwffewfw,ebgdgtbr,tyhtyh,sdcsdc,rftger,wscsdc,dervwe,csd,cer
      DATA sadko,sweoijnwe,efjwne,edkjwen,ewdkjwedoiwed,ewweidw,e,erwgt,rth,ws,fsadfsdf,sd
      DATA dsf,asdf,asdfasdf
 


And the PROFILER.BBC report

Code:
Profiler report file - Sun.29 Mar 2009,17:11:51
Figures in the first column indicate approximate
time in milliseconds spent in each program line.

      4273:       REM Which is faster?
         0:       REM checking against an array or in an unrolled case statement
         0:       DIM A$(50)
         0:       FOR I%=1 TO 50
         0:       READ A$(I%)
         0:       NEXT
         0:       
         0:       T%=10000
         0:       REM Test 1
         0:       T=TIME
         0:       FOR J%=1 TO T%
         3:       R%=RND(5)
         8:       IF R%=1 THEN B$=A$(RND(50)) ELSE B$="Dummy"
         1:       F%=FALSE
         1:       C%=1
         1:       REPEAT
       279:       IF B$=A$(C%) THEN F%=TRUE
       129:       C%+=1
       246:       UNTIL C%=51 OR F%=TRUE
         2:       NEXT
         0:       TT=TIME-T
         0:       PRINT TT
         0:       
         0:       T=TIME
         1:       FOR J%=1 TO T%
         1:       R%=RND(5)
         8:       IF R%=1 THEN B$=A$(RND(50)) ELSE B$="Dummy"
         2:       F%=FALSE
         2:       CASE B$ OF
        22:       WHEN  "ASDKJASD","ASDOIJASD","ASDOJASD","EGIJUNGR","NFROIN","IJNUVF","IJNSDC","IJNCWEC","IOEWNCF",  \
        32:       \   "OIJDF","SF","ERGFEWRF","WSEF","H","RFGTH","SDFS","F","EGTRERG","SDFVSDF","ERFWEF","SDF","ERFWEFR","SD",  \
        32:       \   "jdfsdf","sdf","wef","wefwffewfw","ebgdgtbr","tyhtyh","sdcsdc","rftger","wscsdc","dervwe","csd","cer",    \
        24:       \   "sadko","sweoijnwe","efjwne","edkjwen","ewdkjwedoiwed","ewweidw","e","erwgt","rth","ws","fsadfsdf","sd",  \
         4:       \   "dsf","asdf","asdfasdf"
         2:       F%=TRUE
         0:       OTHERWISE:
         0:       ENDCASE
         1:       NEXT
         0:       TT=TIME-T
         0:       PRINT TT
         0:       
         0:       DATA ASDKJASD,ASDOIJASD,ASDOJASD,EGIJUNGR,JNFROIN,IJNUVF,IJNSDC,IJNCWEC,IOEWNCF
         0:       DATA OIJDF,SF,ERGFEWRF,WSEF,H,RFGTH,SDFS,F,EGTRERG,SDFVSDF,ERFWEF,SDF,ERFWEFR,SD
         0:       DATA jdfsdf,sdf,wef,wefwffewfw,ebgdgtbr,tyhtyh,sdcsdc,rftger,wscsdc,dervwe,csd,cer
         0:       DATA sadko,sweoijnwe,efjwne,edkjwen,ewdkjwedoiwed,ewweidw,e,erwgt,rth,ws,fsadfsdf,sd
         0:       DATA dsf,asdf,asdfasdf
       718: Libraries and immediate mode
 


Michael
Re: Another cunning use of the CASE statement?
Post by admin on Mar 29th, 2009, 6:02pm

Quote:
There is probably a WHILE...ENDWHILE construct which is slightly faster than the REPEAT...UNTIL...

Isn't FOR...NEXT even more straightforward? It's almost certainly faster than either a REPEAT...UNTIL or a WHILE...ENDWHILE:

Code:
      T%=10000
      T=TIME
      FOR J%=1 TO T%
        R%=RND(5)
        IF R%=1 THEN B$=A$(RND(50)) ELSE B$="Dummy"
        F%=FALSE
        FOR C% = 0 TO 50
          IF B$=A$(C%) THEN F% = TRUE : EXIT FOR
        NEXT
      NEXT
      TT=TIME-T
      PRINT TT 

Richard.