The idea that a set is always created with a minimal size is because we always
add at least some elements
to them. We at some point increased that size (from 3 to 5?).
The difference comes from
Set sizeFor: 1 ==> 7
HashedCollection>>#sizeFor: has a special case for small (<4) elements, while
the one of Set does not. Which is odd.
> On 1 Dec 2016, at 14:39, Christophe Demarey <christophe.dema...@inria.fr>
> Thanks for this great explanation Henrik.
> Nevertheless, my question is still valid. Why Set new will give me an
> internal array of 5 elements while Set new: 1 will give me an internal array
> of 7 elements?
> Shouldn’t Set new give an internal of 7 elements as it looks like the minimal
> array size for a set?
> Also I would expect Set new: 0 to give me an empty internal array. It
> explicitly ask an empty Set. A further call to #add: will increase its size
> as expected.
>> Le 1 déc. 2016 à 13:25, Henrik Nergaard <henrik.nerga...@uia.no
>> <mailto:henrik.nerga...@uia.no>> a écrit :
>> Hashed collections keep a portion of the available memory empty (usually
>> 25%) as a partition mechanism to increase lookup speed.
>> “Normal array”
>> | col |
>> col := Smalltalk allClassesAndTraits asArray.
>> [ col includes: 8; includes: Morph ] bench. "'366.853 per second'"
>> “Normal set ~75% load”
>> | set |
>> set := Smalltalk allClassesAndTraits asSet.
>> [ set includes: 8; includes: Morph ] bench. "'4,700,967 per second'"
>> “Set forced to have ~100% load”
>> | array fullLoadSet |
>> array := Smalltalk allClassesAndTraits asSet asArray , #(nil).
>> fullLoadSet:= Set basicNew.
>> instVarNamed: #array put: array;
>> instVarNamed: #tally put: array size.
>> [ fullLoadSet includes: 8; includes: Morph ] bench. "'215.157 per second'"
>> Best regards,
>> From: Pharo-dev [mailto:pharo-dev-boun...@lists.pharo.org
>> <mailto:pharo-dev-boun...@lists.pharo.org>] On Behalf Of Christophe Demarey
>> Sent: Thursday, December 1, 2016 11:49 AM
>> To: Pharo Development List <email@example.com
>> Subject: [Pharo-dev] Set internal array size
>> I just discovered a funny thing.
>> If you create a Set with Set new, you will get a Set with an internal array
>> of 5 elements (hardcoded in Set class>>#new).
>> If you ask explicitly a Set for one or no element: Set new: 0 (or a number
>> between 0 and 5), you will get an internal array of 7 elements.
>> This behavior is a bit strange. Either we always need at least 7 elements
>> and we need to update Set class>>#new, either the method Set
>> class>>#sizeFor: should be updated.