[fpc-pascal] optimization for strlicomp()
Michael Van Canneyt
michael at freepascal.org
Mon Jun 1 09:22:15 CEST 2020
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.
More information about the fpc-pascal
mailing list