Strange performance behavior
Bruce Adams
tortoise_74 at yeah.who.co.uk
Thu Sep 20 01:03:23 PDT 2007
Bill Baxter Wrote:
> Bruce Adams wrote:
> > 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>
>
> Uh oh... you should have left the shields up. Now you're unprotected...
>
>
> --bb
I was invariant but now I'm just const but you still can't modify me through this interface :p
More information about the Digitalmars-d
mailing list