[fpc-pascal] If vs case or something else?

Stefan V. Pantazi svpantazi at gmail.com
Fri Jul 7 00:45:26 CEST 2017


I am not sure I follow. If switching on strings, or any sparse value 
set, you can use the balanced tree approach or better yet, a hash table. 
But when switching on a compact, limited set of integer values (as the 
case seems to be), I do not see how you can compete with constant time 
procedure table/array lookups.

Stefan

> You can skip large blocks of tests coding like this
>
> Not as fast as a tree search balanced with probabilities (no answer to
> my question on the list afew days ago...), but probably ten time faster
> then what you proposed.
>
> Cheers, Ched'
>
>
>
> Le 06.07.2017 à 20:41, Stefan V. Pantazi a écrit :
>> That is quite the case statement you have there. You may benefit
>> greatly from re-analyzing and refactoring your programs by splitting
>> them in multiple individual units, if possible. That should be
>> perfectly possible if Dosomething();    DoSomethingelse(); keep
>> repeating across your 70+ switch cases.
>>
>> Anyway, here you go, you can try something like the attached.
>>
>> Good luck!
>>
>> Stefan
>>
>>
>>
>> On 07/06/2017 12:33 PM, James Richters wrote:
>>> I'm trying to optimize a console application ported over from Turbo
>>> Pascal with a huge set of if then else statements like this:
>>>
>>> Var
>>>      TXT : String;
>>> If TXT = 'Thing1' then
>>>    Begin
>>>       Dosomething();
>>>       DoSomethingelse();
>>>    End
>>> else
>>> If TXT = 'AnotherThing' then
>>>    Begin
>>>       Dosomethinganotherway();
>>>       DoSomethingelsetoo();
>>>    End
>>> Else
>>> If TXT = 'Thing3' then
>>>    Begin
>>>       Dosomethingathirdtime();
>>>       DoSomethingelse3();
>>>    End
>>> else   .... etc..  over 70 times... etc
>>>
>>> It works but it's hard to follow and not so fast.  It has to run
>>> through this for every line of a file to see what's in the file and
>>> do the right things with it.
>>> So I'm thinking of undertaking a huge re-organization of it and I'm
>>> wondering what the best way would be to do it.
>>>
>>> I can use case statement with strings apparently now, but the thing
>>> is,  I create this file myself in an earlier stage, so I do not need
>>> to create the file with strings at all, I could use some codes and do
>>> something like this:
>>>
>>> Const
>>>    Thing1 = 1
>>>     Another_Thing = 2
>>>     Thing3 = 3
>>> Var
>>>     Codenum: Word;
>>>
>>> Case Codenum of
>>>    Thing1: Begin
>>>             DoSomethng()
>>>             DoSomethingElse()
>>>        End;
>>>     Another_Thing: Begin
>>> ... etc ...
>>>
>>>
>>> I'm guessing that would be faster as I wouldn't have to keep
>>> evaluating all the strings for every condition.   As I was searching
>>> for the best way to do this, I came across something about making an
>>> Array of Procedures, or something to that effect.   Does anyone know
>>> how to do that, and are there performance advantages to doing that?
>>> It's going to take a bit of work to straighten all this out so it
>>> would be best if I just did it the best way instead of doing it one
>>> way then finding out it could have been better another way.   Any
>>> other ideas on how to handle this?
>>>
>>> Any advice on this is greatly appreciated
>>>
>>> James
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>>
>>
>>
>>
>> _______________________________________________
>> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
>>
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

-- 
_______________________________________________________



More information about the fpc-pascal mailing list