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@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal
--
_______________________________________________________
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal