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


--
_______________________________________________________
program fast_switch;

uses sysutils,

fast_switch_handler_unit;//implements case handlers

const
  TEST_COUNT=100;

function GetCodeNum():word;
begin
  Result:=Random(MAX_HANDLER_IDX);
end;

var
  i:Integer;
	Codenum: Word; //or enum

begin
  Randomize;
  for i:=0 to TEST_COUNT-1 do
  begin
    WriteLn('Test switching #',i);
    repeat
		  codeNum:=GetCodeNum();
  //execute procedure with index codeNum from PROC_TABLE
		  if (Codenum>0) and (Codenum<=MAX_HANDLER_IDX) then PROC_TABLE[CodeNum];
      Sleep(50);
	  until codeNum=0;
    WriteLn('Done switching test #',i);
  end;
  WriteLn('Done switching test program.');
end.
unit fast_switch_dosomething_unit;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils;

procedure Dosomething();
procedure DoSomethingelse();
procedure Dosomethinganotherway();
procedure DoSomethingelsetoo();
procedure Dosomethingathirdtime();
procedure DoSomethingelse3();

implementation

procedure Dosomething();
begin
  WriteLn('Dosomething()');
end;

procedure DoSomethingelse();
begin
  WriteLn('DoSomethingelse()');
end;

procedure Dosomethinganotherway();
begin
  WriteLn('Dosomethinganotherway()');
end;

procedure DoSomethingelsetoo();
begin
    WriteLn('DoSomethingelsetoo()');
end;

procedure Dosomethingathirdtime();
begin
  WriteLn('Dosomethingathirdtime()');
end;

procedure DoSomethingelse3();
begin
  WriteLn('DoSomethingelse3()');
end;

end.

unit fast_switch_handler_unit;

{$mode objfpc}{$H+}

interface

uses
	fast_switch_dosomething_unit;//implements DoSomething*
const
  MAX_HANDLER_IDX=3;// or 70

procedure Thing1_Handler();
procedure AnotherThing_Handler();
procedure Thing3_Handler();

const
	PROC_TABLE:array[1..MAX_HANDLER_IDX] of procedure=(
		@Thing1_Handler,
		@AnotherThing_Handler,
		@Thing3_Handler
//		...
    //@Thing70_Handler
		);

implementation

procedure Thing1_Handler();
Begin
	Dosomething();
	DoSomethingelse();
End;

procedure AnotherThing_Handler();
Begin
	Dosomethinganotherway();
	DoSomethingelsetoo();
End;

procedure Thing3_Handler();
Begin
	Dosomethingathirdtime();
	DoSomethingelse3();
End;

end.

_______________________________________________
fpc-pascal maillist  -  fpc-pascal@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal

Reply via email to