[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