[Cuis-dev] allSubclasses and withAllSubclasses improvement
Andres Valloud
ten at smallinteger.com
Fri Aug 23 15:34:33 PDT 2019
See attached for your reference.
On 8/22/19 05:36, Juan Vuletich wrote:
> On 8/21/2019 4:29 PM, Andres Valloud via Cuis-dev wrote:
>> What do you see as "ugly"?
>
> It is way more complicated than needed to solve the problem. The problem
> is trivial, this code is not. And there is no reason for this: class
> hierarchy depths shouldn't be so deep to be a challenge for the call stack.
>
> Hernán's code is only as complex as the problem, without accidental
> complexity (in the Fred Brooks sense). It is a clear explanation of the
> problem and the solution.
>
> To me, code aesthetics is not only about code being clear, and a good
> explanation of the problem and the solution. It is also about being the
> best fit for the problem (including human readers here: the system is
> the curricula). Sometimes, performance requirements or space constraints
> require additional complexity. Then, I see that extra complexity as
> pretty. This is of course subjective, like any aesthetic judgment.
>
>> One detail I don't see mentioned here: the old code filled the ordered
>> collection breadth first (before the set conversion), and so it has
>> limited execution stack depth. The current code fills the collection
>> depth first, so its execution stack depth is as deep as the hierarchy
>> tree.
>>
>> Maybe there was a reason why the users of allSubclasses were better
>> off with breadth first, before someone put in asSet. Or perhaps asSet
>> was always there, I don't see why that was beneficial.
>>
>> In any case, I tried both the recursive and (properly implemented)
>> iterative methods: breadth first is >20% faster.
>>
>> On 8/21/19 05:44, Juan Vuletich via Cuis-dev wrote:
>>> Wow, thanks. The old code was slow and ugly!
>>>
>>> Integrating it.
>>>
>>> Cheers,
>>>
>>> --
>>> Juan Vuletich
>>> www.cuis-smalltalk.org
>>> https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
>>> https://github.com/jvuletich
>>> https://www.linkedin.com/in/juan-vuletich-75611b3
>>> @JuanVuletich
>>>
>>>
>>> On 8/21/2019 9:26 AM, Hernan Wilkinson via Cuis-dev wrote:
>>>> Hi,
>>>> attached is a cs that changes the implementation of #allSubclasses
>>>> and #withAllSubclasses and generates performance improvement
>>>> drastically.
>>>> Just as a quick example, with the current implementation:
>>>> Time millisecondsToRun: [ 100 timesRepeat: [Behavior
>>>> withAllSubclasses ]] 1140 .
>>>> With the proposed change:
>>>> Time millisecondsToRun: [ 100 timesRepeat: [Behavior
>>>> withAllSubclasses2 ]] . 73
>>>>
>>>> In the type checker of LiveTyping, checking Behavior goes from 9.5
>>>> seconds to 5 seconds only with that change.
>>>> One difference between the current and proposed version, is that
>>>> the current returns a Set while the proposed version returns an
>>>> OrderedCollection.
>>>> I looked carefully if that could break something and it does not.
>>>> I've been using the image with this new implementation and
>>>> everything works fine.
>>>>
>>>> Juan, please take a look at it and integrate it if you think it is
>>>> useful.
>>>> Hernan.
>>>>
>>>> --
>>>> *Hernán Wilkinson
>>>> Agile Software Development, Teaching & Coaching*
>>>> *Phone: +54-011*-4893-2057
>>>> *Twitter: @HernanWilkinson*
>>>> *site: http://www.10Pines.com <http://www.10pines.com/>*
>>>> Address: Alem 896, Floor 6, Buenos Aires, Argentina
>>>
>
>
-------------- next part --------------
'From Cuis 4.2 of 25 July 2013 [latest update: #2595] on 23 August 2019 at 3:32:40.851001 pm'!
!Behavior methodsFor: 'accessing class hierarchy' stamp: 'sqr 8/23/2019 15:32'!
allSubclasses
| answer finger fingerLimit each |
answer := OrderedCollection new.
self subclassesDo: [:some | answer add: some].
finger := 0.
fingerLimit := answer size.
[finger < fingerLimit] whileTrue:
[
finger + 1 to: fingerLimit do:
[:index |
each := answer at: index.
each subclassesDo: [:some | answer add: some]
].
finger := fingerLimit.
fingerLimit := answer size.
].
^answer! !
More information about the Cuis-dev
mailing list