> On 20 Dec 2015, at 12:59, Max Leske <maxle...@gmail.com> wrote: > > I would like to wrap up this discussion.
Good idea. >> On 05 Dec 2015, at 18:14, stepharo <steph...@free.fr> wrote: >> >> So what is the conclusion? >> I like the idea of Esteban M to have iterator because it moves some behavior >> out of core classes. >> >> [[[ >> >> aCollection arithmetic sum: [...] or.... aCollection >> arithmetic avg. >> >> ]]] >> > > While I think that iterators are an intriguing idea I also believe that they > are beyond the scope of this issue. If anybody wants to follow up on > iterators (or unit types for that matter) please start a new thread / issue. > > > I propose to use Sven’s version for #sum:ifEmpty:. The result would be these > three methods: > > sum > ^ self > sum: [ :each | each ] > ifEmpty: [ 0 ] > > sum: aBlock > ^ self > sum: aBlock > ifEmpty: [ self errorEmptyCollection ] > > sum: aBlock ifEmpty: emptyBlock > | sum sample | > self isEmpty ifTrue: [ ^ emptyBlock value ]. > sample := self anyOne. > sum := self > inject: sample > into: [ :accum :each | accum + (aBlock value: each) ]. > ^ sum - sample > > > I’ve attached a couple of benchmark results below. To me they show that > 1. the new implementation is maybe a tiny bit slower but insignificantly so > (if you’re going for performance you’ll probably write your own optimised > version anyway) > 2. there is no need to duplicate the code (like #sum and #sum: currently do). > It’s perfectly fine to delegate to #sum:ifEmpty: > > > > In addition to the above changes I would like to remove #detectSum: (-> > #sum:) and #sumNumbers (-> #sum). > > > Note that once we agree on changing this API, we will need to also change > #detectMin:, #detectMax:, #min, #max as well as all overrides (e.g. RunArray, > Interval) of these and of #sum et. al. to stay consistent. The changes would > of course be in line with this change, such that every operation has a unary > selector with a sensible default, one that takes a block and throws an error > for empty collections and a third that takes a block for the iteration and > one for the empty case. Excellent summary, thanks. > Please cast your vote for these changes: > > 1. Do you agree to changing #sum and #sum: in the suggested way? yes > 2. Do you agree to the removal of #detectSum:? yes > 3. Do you agree to the removal of #sumNumbers? yes > 4. Do you agree that the #max and #min selectors also need to be adapted? probably yes. > Thanks for you help. > > Cheers, > Max > > > > > > Benchmarks > ============ > (Note that these aren’t very good benchmarks. There’s quite some variation on > each run.) You should exclude your setup out of your actual benchmark, like this: | numbers | numbers := (1 to: 1000000) asArray. [ numbers sum ] benchFor: 10 seconds. "a BenchmarkResult(126 iterations in 10 seconds 77 milliseconds. 12.504 per second)" > Machine: > MacBook Pro (15-inch, Early 2011) > CPU: 2.2 GHz Intel Core i7 > Memory: 8 GB 1333 MHz DDR3 > Disk: APPLE SSD TS512C (500 GB) > > > Benchmarks of the current versions: > > [ (1 to: 1000000) asArray sum ] benchFor: 10 seconds. > 75 iterations, 7.470 per second > > [ (1 to: 1000000) asArray sum: [ :e | e ] ] benchFor: 10 seconds. > 72 iterations, 7.128 per second > > > [ (1 to: 100) asArray sum ] benchFor: 10 seconds. > 1,189,477 iterations, 118,912 per second > > > [ (1 to: 100) asArray sum: [ :e | e ] ] benchFor: 10 seconds. > 1,171,467 iterations, 117,112 per second > > > > Benchmarks of the new versions: > > [ (1 to: 1000000) asArray sum ] benchFor: 10 seconds. > 73 iterations, 7.244 per second > > [ (1 to: 1000000) asArray sum: [ :e | e ] ] benchFor: 10 seconds. > 75 iterations, 7.480 per second > > [ (1 to: 1000000) asArray sum: [ :e | e ] ifEmpty: [ 0 ] ] benchFor: 10 > seconds. > 72 iterations, 7.141 per second > > > [ (1 to: 100) asArray sum ] benchFor: 10 seconds. > 1,115,827 iterations, 111,560 per second > > [ (1 to: 100) asArray sum: [ :e | e ] ] benchFor: 10 seconds. > 1,154,595 iterations, 115,425 per second > > [ (1 to: 100) asArray sum: [ :e | e ] ifEmpty: [ 0 ] ] benchFor: 10 seconds. > 1,102,358 iterations, 110,203 per second >