[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]
{
DJ>Can anyone please help me speed up the following functions?
Aha! A challange! <g>
DJ>I wouldn't mind using built-in assembly either!
You can still achieve a large increase in speed without using
assembly code. Here's my stab at rewriting your routines.
(These could be written faster still, but I'll leave that up
to you.)
}
{$A+,B-,D-,E-,F-,G-,I-,L-,N-,O-,P-,Q-,R-,S+,T-,V-,X-}
{$M 4096,0,655360}
program Test_New_Tab_Functions;
(***** Remove space-wasting chars from end of line. *)
(* *)
function TrimRight2({input }
st_IN : string) :
{output}
string;
var
by_Index : byte;
begin
by_Index := length(st_IN);
while st_IN[by_Index] IN [#0,#9,#32] do
begin
dec(by_Index);
dec(st_IN[0])
end;
TrimRight2 := st_IN
end; (* TrimRight2. *)
(***** Replace tabs with 8 spaces. *)
(* *)
function DeTab2({input }
st_IN : string) :
{output}
string;
var
by_Index1,
by_Index2 : byte;
st_Temp : string;
begin
by_Index2 := 0;
fillchar(st_Temp[1], 255, #32);
for by_Index1 := 1 to length(st_IN) do
if (st_IN[by_Index1] <> #9) then
begin
inc(by_Index2);
st_Temp[by_Index2] := st_IN[by_Index1]
end
else
by_Index2 := succ(by_Index2 shr 3) shl 3;
st_Temp[0] := chr(by_Index2);
DeTab2 := st_Temp
end; (* DeTab2. *)
(***** Replace spaces with tabs to compress string. *)
(* *)
function EnTab2({input }
st_IN : string) :
{output}
string;
var
by_Count,
by_IndexIN,
by_IndexOUT : byte;
st_Temp : string;
begin
by_IndexIN := 0;
by_IndexOUT := 0;
by_Count := 0;
st_Temp[0] := #0;
fillchar(st_Temp[1], length(st_IN), #32);
repeat
inc(by_IndexIN);
if (st_IN[by_IndexIN] <> #32) then
begin
inc(by_IndexOUT);
st_Temp[by_IndexOUT] := st_IN[by_IndexIN]
end
else
begin
by_Count := 0;
while ((by_IndexIN + by_Count) < length(st_IN))
AND (st_IN[(by_IndexIN + by_Count)] = #32)
AND (((by_IndexIN + by_Count) mod 8) <> 0) do
inc(by_Count);
if (by_Count > 0) then
begin
if (((by_IndexIN + by_Count) mod 8) = 0) then
begin
inc(by_IndexOUT);
st_Temp[by_IndexOUT] := #9;
inc(by_IndexIN, by_Count)
end
else
begin
inc(by_IndexOUT, by_Count);
inc(by_IndexIN, pred(by_Count))
end
end
else
inc(by_IndexOUT)
end
until (by_IndexIN = length(st_IN));
st_Temp[0] := chr(by_IndexOut);
EnTab2 := st_Temp
end; (* EnTab2. *)
var
by_Loop : byte;
st_Temp1,
st_Temp2 : string;
BEGIN
st_Temp1[0] := chr(245);
fillchar(st_Temp1[1], 245, 'A');
st_Temp1 := st_Temp1 + #9#0#32#32#9#9#9#0#32#0;
st_Temp2 := TrimRight2(st_Temp1);
st_Temp1 := '';
for by_Loop := 1 to 17 do
st_Temp1 := st_Temp1 + 'ABCDEFG' + #9;
st_Temp2 := DeTab2(st_Temp1);
st_Temp1 := '';
for by_Loop := 1 to 25 do
st_Temp1 := st_Temp1 + 'ABCDE ';
st_Temp2 := EnTab2(st_Temp1)
END.
Benchmarking my new routines against your old routines on my
386DX-40 running Novell DOS 7.0, the results are:
Old TrimRight Time = 1.034 ms
New TrimRight Time = 0.126 ms (820 percent faster)
Old DeTab Time = 2.514 ms
New DeTab Time = 0.391 ms (640 percent faster)
Old EnTab Time = 8.450 ms
New EnTab Time = 1.004 ms (840 percent faster)
...Two things to keep in mind when trying to optimize a routine
are:
Always try to reduce the number of loops your routine
has to make.
Copy/Move your data as little as possible.
[Back to STRINGS SWAG index] [Back to Main SWAG index] [Original]