On Sun, 28 Dec 2014, Mattias Gaertner wrote:

Hi,

forwarded from Zeljko:

It's about fpc issue
http://bugs.freepascal.org/view.php?id=26370

It seems that TVariantArrayIterator.AtEnd loops for all Dims for no reason, so 
have
impact on performance.

*current implementation*
function TVariantArrayIterator.AtEnd: Boolean;
var
  i : sizeint;
begin
  result:=false;
  for i:=0 to Pred(Dims) do
    if Coords^[i] >= Bounds^[i].LowBound + Bounds^[i].ElementCount then
      result:=true;
end;

*optimized implementation*
function TVariantArrayIterator.AtEnd: Boolean;
var
  i : sizeint;
begin
  result:=false;
  for i:=0 to Pred(Dims) do
    if Coords^[i] >= Bounds^[i].LowBound + Bounds^[i].ElementCount then
    begin
      result:=true;
      break;
    end;
end;

Or, better yet

var
  i : sizeint;
begin
  Result:=false;
  I:=0;
  While (Not Result) and (I<=Pred(Dims)) do
    begin
    Result:= Coords^[i] >= Bounds^[i].LowBound + Bounds^[i].ElementCount;
    Inc(I);
    end;
end;

People really don't seem to get booleans, and why they scorn "While" is beyond me. All 
these ugly "break" statements :(

You may optimize even more by calculating Max:=pred(dims) once and doing I<=Max;

Michael.
_______________________________________________
fpc-devel maillist  -  [email protected]
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel

Reply via email to