[Issue 4725] std.algorithm.sum()

d-bugmail at puremagic.com d-bugmail at puremagic.com
Fri Dec 24 11:25:27 PST 2010


http://d.puremagic.com/issues/show_bug.cgi?id=4725



--- Comment #4 from Denis Derman <denis.spir at gmail.com> 2010-12-24 11:23:28 PST ---
(In reply to comment #2)
> sum() may be implemented better than just using reduce() because a smarter
> sum() may keep inside two variables and sum them in parallel each loop. And
> then sum the two partial sums at the end and return them. Experiments (and
> theory) show that on modern CPUs this is more efficient than a normal loop with
> a single accumulation variable.
> 
> I mean code like (specialized for random access ranges, that's a very common
> case worth specializing for, because sum() is a very common operation that
> needs to be fast):
> 
> 
> switch (array.length) {
>     case 0:
>         break;
>     case 1:
>         total = array[0];
>         break;
>     default:
>         total = array[0];
>         auto total2 = cast(typeof(total))array[1];
>         int stop = array.length & (~1);
>         for (int i = 2; i < stop; i += 2) {
>             total += array[i];
>             total2 += array[i + 1];
>         }
>         total += (array.length % 2 ? (total2 + array[$-1]) : total2);
>         break;
> }
> // return total here

You should add a 'case 2:' to avoid complication of a simple and common case.
Maybe also avoid // computation under a given number of elements (to be
defined).

denis

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------


More information about the Digitalmars-d-bugs mailing list