Strange performance behavior

Marius Muja mariusm at cs.ubc.ca
Wed Sep 19 18:15:49 PDT 2007


Bill Baxter wrote:
> Bill Baxter wrote:
>> Marius Muja wrote:
>>> I have noticed the following strange (at least for me) performance 
>>> behavior with one of my programs. It is a program that does some 
>>> scientific computations and while trying to optimize it I noticed 
>>> that the code from case_B below executes faster (almost twice as 
>>> fast) as the code in case_A. This is a bit counterintuitive for me, 
>>> since in case _B there is also the cost of the function call (or 
>>> should be the same if the function is inlined).
>>> Can anybody shed some light on why it's behaving this way?
>>>
>>> case_A:
>>> -------------------------------
>>> foreach (i,index; indices) {
>>>    foreach (k, inout value; centers[belongs_to[i]])
>>>     value += vecs[index][k];
>>> }
>>> ----------------------------------
>>>
>>> case_B:
>>> -------------------------------
>>> void addTo(T,U)(T[] a, U[] b) {
>>>    foreach(index, inout value; a) {
>>>       value += b[index];
>>>    }
>>> }
>>> ....
>>> foreach (i,index; indices) {
>>>    addTo(centers[belongs_to[i]],vecs[index]);
>>> }
>>> _______________________________
>>
>> My guess would be the compiler's failure to optimize[*] away the 
>> [index] indexing in A.  So you do 2 lookups per iteration rather than 
>> just one.  If so then this should be just as fast as case_B:
>>
>> foreach (i,index; indices) {
>>    auto vecs_i = vecs[index];
>>    foreach (k, inout value; centers[belongs_to[i]])
>>       value += vecs_i[k];
>> }
>>
> Forgot the footnote!:
> 
> [*] It may not really be a failure of the optimizer -- maybe it's 
> unreasonably difficult to determine absolutely that vecs won't changed 
> by the operation '+= vecs[index][k]'.
> 
> --bb

Yes, that was it! Thanks for clearing this up for me.




More information about the Digitalmars-d mailing list