On Sun, 28 Dec 2014, Sergei Gorelkin wrote:
28.12.2014 17:36, Michael Van Canneyt пишет:
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;
Actually, in this particular case performance optimizations are pretty
useless:
- TVariantArrayIterator.AtEnd method is called just once to decide whether it
is necessary to
iterate the array. Its usage is not typical for iterators, where such methods
are called in a loop.
- To return False, it has to iterate all dimensions. After that, iterating
the data of variant array
will take orders of magnitude more time.
- Early exit can happen only for arrays with zero-sized dimension, which is
basically invalid and
indicates programmer's mistake elsewhere.
All this may of course be true for this particular case, but it's in general always better
to have optimized code. So I have committed the code as I replied it (after testing
that the test program still performs as expected).
Michael.
_______________________________________________
fpc-devel maillist - fpc-devel@lists.freepascal.org
http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-devel