Or just make Collection>>#size a subclassResponsibiliity!
This will force implementors to give proper #size implementations that are usually O(1), which almost all do already. Bag could get the #do:-based #isEmpty as an optimization, or we could add a dedicated 'tally' inst var like other collections have and its #size could return that, making the default #size-based #isEmpty OK for it.
This is a compromise that addresses the concerns about the default Collection>>#isEmpty degrading linearly without a constant #size and the concerns about harming the performance of existing libraries and applications with custom collections that assume Collection>>#isEmpty is #size-based.
Please consider it.
From: "Bert Freudenberg" bert@freudenbergs.de To: "Chris Muller" ma.chris.m@gmail.com, "The general-purpose Squeak developers list" squeak-dev@lists.squeakfoundation.org Subject: Re: [squeak-dev] Re: The defaullt implementation of isEmpty might do too much work
On Thu, Oct 27, 2016 at 12:51 AM, Chris Muller <asqueaker@gmail.com[mailto:asqueaker@gmail.com]> wrote: In exchange for these blemishes, how many classes actually got benefit from inheriting the new implementation?
| b | b := (1 to: 10000) asBag. [b isEmpty] bench
before: : '5,540 per second. 181 microseconds per run.' now: '167,000 per second. 6 microseconds per run.' In my book that's a speedup worth having.