Performance optimization for minElement and maxElement
JG
someone at somewhere.com
Mon Sep 12 17:05:44 UTC 2022
On Monday, 12 September 2022 at 16:26:01 UTC, Paul Backus wrote:
> On Monday, 12 September 2022 at 15:27:25 UTC, Steven
> Schveighoffer wrote:
>> This isn't that crazy though. Checking against an absolute
>> minimum or maximum has a cost, one which you may not want to
>> incur.
>>
>> For instance, uint.min is 0, this might be a common occurrence
>> in some ranges. But int.min is -2billion. That might *never*
>> occur in some ranges. Why waste time checking for something
>> that will never occur in the name of "performance"? For many
>> types and data sets, this is a net pessimization.
>>
>> And there's not a way to do this shortcut via type wrapping.
>> The only option is to alter the algorithm. Making it opt-in
>> isn't a bad idea, but of course, the API could be badly
>> designed.
>
> It seems like maybe what's desired here is a version of
> [`fold`][1] that allows for early termination. Like, instead of
> just returning the next accumulator value, the callback could
> return a tuple of the next value and a `bool continue`, or
> something.
>
> [1]:
> https://phobos.dpldocs.info/std.algorithm.iteration.fold.html
Could build it like this (not sure performance is great).
```d
import std;
auto stoppingFold(alias stopCond, alias op, R)(R r) {
return
r.cumulativeFold!op.until!(stopCond)(No.openRight).fold!((a,b)=>b);
}
void main() {
auto x = [1,2,4,3];
assert(x.stoppingFold!(x=>x==0,(a,b)=>min(a,b))==1);
x = [1,0,4,3];
assert(x.stoppingFold!(x=>x==0,(a,b)=>min(a,b))==1);
}
```
More information about the Digitalmars-d
mailing list