Strange performance behavior
Bruce Adams
tortoise_74 at yeah.who.co.uk
Wed Sep 19 17:38:11 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
<shields up>
This is exactly the sort of thing where const would help :)
</shields down>
More information about the Digitalmars-d
mailing list