[fpc-devel] about commit r29324

Sergei Gorelkin sergei_gorelkin at mail.ru
Sun Dec 28 16:03:37 CET 2014


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.

Regards,
Sergei




More information about the fpc-devel mailing list