2009/12/4 Lukas Renggli <[email protected]>:
> Actually the code can be further optimized:
>
> Dictionary>>keys
>        "Answer a Set containing the receiver's keys."
>
>        | result container |
>        result := Set basicNew setTally: tally array: array copy.
>        container := result array.
>        1 to: container size do: [ :index |
>                (container at: index)
>                        ifNotNil: [ :assoc | container at: index put: assoc 
> key ] ].
>        ^ result
>
> This is roughly 22 times faster than the current implementation, and 5
> times faster than the squeak implementation.
>
> The system doesn't seem to break with this change :-)
>
except that it breaking encapsulation.
Thus i vote -1 for this kind of optimization :)

> Lukas
>
> 2009/12/4 Lukas Renggli <[email protected]>:
>> I wonder if ever something along the following lines was considered?
>>
>> Dictionary>>keys
>>        "Answer a Set containing the receiver's keys."
>>
>>        | result |
>>        result := Set basicNew.
>>        result setTally: tally array: (array collect: [ :each |
>>                each isNil ifFalse: [ each key ] ]).
>>        ^ result
>>
>> This returns a Set, so it wouldn't break any semantics. In my
>> benchmark this is roughly 8x faster than the current implementation,
>> and 2x faster than the optimized Squeak implementation.
>>
>> The drawback is that it makes some heavy assumptions on the internal
>> structure of Dictionary, Association and Set.
>>
>> Lukas
>>
>> 2009/12/4 Henrik Sperre Johansen <[email protected]>:
>>> A small addendum ;)
>>> On 03.12.2009 22:13, Nicolas Cellier wrote:
>>>> 3) identify thise sending a potential inefficient message (includes:)
>>>> insert keys asSet in this case (only if includes: is in a loop!)
>>>>
>>>>
>>> 3b. If the keys collection isn't used for anything else, change to use
>>> includesKey: instead.
>>>
>>> Cheers,
>>> Henry
>>>
>>> _______________________________________________
>>> Pharo-project mailing list
>>> [email protected]
>>> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>>>
>>
>>
>>
>> --
>> Lukas Renggli
>> http://www.lukas-renggli.ch
>>
>
>
>
> --
> Lukas Renggli
> http://www.lukas-renggli.ch
>
> _______________________________________________
> Pharo-project mailing list
> [email protected]
> http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project
>



-- 
Best regards,
Igor Stasenko AKA sig.

_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to