BBC BASIC for Windows
« Another cunning use of the CASE statement? »

Welcome Guest. Please Login or Register.
Apr 5th, 2018, 10:11pm



ATTENTION MEMBERS: Conforums will be closing it doors and discontinuing its service on April 15, 2018.
Ad-Free has been deactivated. Outstanding Ad-Free credits will be reimbursed to respective payment methods.

If you require a dump of the post on your message board, please come to the support board and request it.


Thank you Conforums members.

BBC BASIC for Windows Resources
Online BBC BASIC for Windows documentation
BBC BASIC for Windows Beginners' Tutorial
BBC BASIC Home Page
BBC BASIC on Rosetta Code
BBC BASIC discussion group
BBC BASIC for Windows Programmers' Reference

« Previous Topic | Next Topic »
Pages: 1  Notify Send Topic Print
 thread  Author  Topic: Another cunning use of the CASE statement?  (Read 837 times)
Michael Hutton
Developer

member is offline

Avatar




PM

Gender: Male
Posts: 248
xx Another cunning use of the CASE statement?
« Thread started 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
User IP Logged

admin
Administrator
ImageImageImageImageImage


member is offline

Avatar




PM


Posts: 1145
xx Re: Another cunning use of the CASE statement?
« Reply #1 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.
User IP Logged

Pages: 1  Notify Send Topic Print
« Previous Topic | Next Topic »

| |

This forum powered for FREE by Conforums ©
Terms of Service | Privacy Policy | Conforums Support | Parental Controls