On Sun, 31 May 2020, Alexey Tor. via fpc-pascal wrote:
function strlicomp(str1,str2 : pwidechar;l : SizeInt) : SizeInt;
var
counter: sizeint;
c1, c2: char;
begin
counter := 0;
if l=0 then
begin
strlicomp := 0;
exit;
end;
repeat
c1:=simplewideupcase(str1[counter]);
c2:=simplewideupcase(str2[counter]);
if (c1=#0) or (c2=#0) then break;
inc(counter);
until (c1<>c2) or (counter>=l);
strlicomp:=ord(c1)-ord(c2);
end;
suggestions:
a)
if (c1=#0) or (c2=#0) then break;
->
if c1=#0 then break;
if c2=#0 then break;
Why do you think this is faster ? If boolean shortcut evaluation is used, it
amounts to the same.
b)
embed upcase to avoid CALL
c1:=simplewideupcase(str1[counter]);
c2:=simplewideupcase(str2[counter]);
->
c1:= str1[counter];
c2:= str2[counter];
if (c1>='a') and (c1<='z') then dec(c1, 32);
if (c2>='a') and (c2<='z') then dec(c2, 32);
I think the correct solution is to use a correct widestring upcase, not the
simple
one.
c) not sure..
we have 2 same diff's
c1<>c2
and
ord(c1)-ord(c2)
That can be changed, but the gain is almost zero as the second one is
outside of the loop anyway..
Michael.
_______________________________________________
fpc-pascal maillist - fpc-pascal@lists.freepascal.org
https://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal