[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