On May 6, 2010, at 11:24 , Mariano Martinez Peck wrote:
> Hi folks. I was just trying to understand this optimization of the Compact
> Classes. If I understood correctly, most objects needs a second word there
> they have 30 bits of OOP of their class and 2 for the header type.
>
> There are classes that have a LOT of instances. For those cases we have
> compact classes where their instances have a number using those 5 bits in
> the first word of the header, and thus, they don't need a second header.
> Then, less memory is used.
>
> So...I understood ok ?
>
> Now, if that is the situation. I have evaluated Smalltalk
> compactClassesArray �and I see that in the array there are a lot of nils. 16
> classes in Squeak and 15 in Pharo. The rest of the 31, are just nil.
>
> Now I wonder if it is worth to do anything with that :
>
> a) Use 4 bits instead of 5 and free one more bit in the OH
> b) remove completely CompactClasses as Adrian said
> c) Let 5 bits but then add more classes (up to 31) so that we can get
> benefits of that. Do you know if there are side effects of becomingCompact a
> class ?
>
> If I evaluate SpaceTally new printSpaceAnalysis �I get something like this:
>
> Class � � � � � � � � � � � � � code space # instances �inst space percent
> ByteString � � � � � � � � � � � � � �2217 � � � 71317 � � � 3621735 � �19.3
> CompiledMethod � � � � � � � � � � � 21064 � � � 56057 � � � 3517772 � �18.7
> Bitmap � � � � � � � � � � � � � � � �3893 � � � �2256 � � � 3424604 � �18.2
> Array � � � � � � � � � � � � � � � � 2478 � � � 71108 � � � 2198420 � �11.7
> ByteSymbol � � � � � � � � � � � � � � 959 � � � 37896 � � � �962465 � � 5.1
> ByteArray � � � � � � � � � � � � � � 2778 � � � � 317 � � � �778297 � � 4.1
> MethodDictionary � � � � � � � � � � �1819 � � � �5964 � � � �449252 � � 2.4
> MCVersionInfo � � � � � � � � � � � � 1313 � � � 10369 � � � �414760 � � 2.2
> DateAndTime � � � � � � � � � � � � � 6974 � � � 13793 � � � �331032 � � 1.8
> WeakArray � � � � � � � � � � � � � � �827 � � � � 286 � � � �326900 � � 1.7
> Association � � � � � � � � � � � � � �749 � � � 26784 � � � �321408 � � 1.7
> UUID � � � � � � � � � � � � � � � � �1528 � � � 10370 � � � �248880 � � 1.3
> Float � � � � � � � � � � � � � � � �11442 � � � 16450 � � � �197400 � � 1.1
> ClassOrganizer � � � � � � � � � � � �1398 � � � �5964 � � � �190848 � � 1.0
> ODatedEntry � � � � � � � � � � � � � �263 � � � �7049 � � � �169176 � � 0.9
> Time � � � � � � � � � � � � � � � � �5530 � � � 10369 � � � �165904 � � 0.9
> Duration � � � � � � � � � � � � � � �3025 � � � 10290 � � � �164640 � � 0.9
> Date � � � � � � � � � � � � � � � � �3167 � � � 10289 � � � �164624 � � 0.9
> LargePositiveInteger � � � � � � � � �2515 � � � 14340 � � � �118169 � � 0.6
> Metaclass � � � � � � � � � � � � � � 4250 � � � �2876 � � � �115040 � � 0.6
> Point � � � � � � � � � � � � � � � � 6404 � � � �8476 � � � �101712 � � 0.5
> GlyphForm � � � � � � � � � � � � � � �307 � � � �2030 � � � � 73080 � � 0.4
> FreeTypeCacheEntry � � � � � � � � � � 536 � � � �2238 � � � � 71616 � � 0.4
> SpaceTallyItem � � � � � � � � � � � � 651 � � � �2509 � � � � 60216 � � 0.3
> OrderedCollection � � � � � � � � � � 5351 � � � �2831 � � � � 56620 � � 0.3
> FreeTypeFileInfo � � � � � � � � � � � 797 � � � � 321 � � � � 30816 � � 0.2
> FreeTypeFontFamilyMember � � � � � � �1274 � � � � 537 � � � � 25776 � � 0.1
> Color � � � � � � � � � � � � � � � �21202 � � � �1255 � � � � 25100 � � 0.1
> TraitComposition � � � � � � � � � � �2651 � � � �2013 � � � � 24156 � � 0.1
> Set � � � � � � � � � � � � � � � � � 3510 � � � �1358 � � � � 21728 � � 0.1
> Dictionary � � � � � � � � � � � � � �5742 � � � �1344 � � � � 21504 � � 0.1
> RemoteString � � � � � � � � � � � � �1533 � � � �1236 � � � � 19776 � � 0.1
> SparseLargeTable � � � � � � � � � � �2376 � � � � � 2 � � � � 18708 � � 0.1
> WordArray � � � � � � � � � � � � � � 1821 � � � � �30 � � � � 18608 � � 0.1
> SoundBuffer � � � � � � � � � � � � � 3299 � � � � � 3 � � � � 18508 � � 0.1
> Pragma � � � � � � � � � � � � � � � �1558 � � � � 862 � � � � 17240 � � 0.1
> Preference � � � � � � � � � � � � � �1534 � � � � 379 � � � � 16676 � � 0.1
> EventHandler � � � � � � � � � � � � �3216 � � � � 125 � � � � 14500 � � 0.1
> MorphExtension � � � � � � � � � � � �3249 � � � � 277 � � � � 14404 � � 0.1
> Character � � � � � � � � � � � � � � 6428 � � � � 939 � � � � 11268 � � 0.1
> SortedCollection � � � � � � � � � � �1496 � � � � 462 � � � � 11088 � � 0.1
> AdditionalMethodState � � � � � � � � 2576 � � � � 859 � � � � 10304 � � 0.1
> ISOLanguageDefinition � � � � � � � �18114 � � � � 402 � � � � �9648 � � 0.1
> TimeStamp � � � � � � � � � � � � � � �861 � � � � 392 � � � � �9408 � � 0.1
>
>
> So...for this quick evaluation, maybe we can become compact also the
> following classes for example:
>
> Smalltalk compactClassesArray
>
> #( ByteSymbol ByteArray MethodDictionary "Association" "WeakArray"
> "Metaclass" DateAndTime UUID Time Duration Date "MethodDictionary"
> ClassOrganizer Metaclass Pragma OrderedCollection RemoteString WordArray
> Color Character )
> do: [:each | (Smalltalk at: each) becomeCompact]
>
> Do this make sense ? How could I measure this? �I took a Pharo image and
> compare the memory used by the VM running all test before and after those
> new compact classes. From the "Activity monitor" I noticed between 3 and 5
> MB less used with these new compact classes.
>
> Thanks in advance
>
> Mariano
>
>
> On Tue, May 4, 2010 at 2:12 PM, Adrian Lienhard <
adi@netstyle.ch> wrote:
>
>>
>> Hi Mariano,
>>
>> I see two solutions
>> - make the identityHash (even) smaller
>> - remove compact classes
>>
>> The former would probably not be hard to implement (just change some bit
>> masks and then rehash all sets). I've brought up the idea about the latter
>> some time ago on this mailing list. The idea is to remove compact classes to
>> get a larger identityHash (trading memory against speed). After the removal,
>> only two header types are left and hence you gain a spare bit. I think this
>> shouldn't be too much work either, but I haven't come around to implementing
>> it (yet).
>>
>> Good luck ;)
>> Adrian
>>
>> On May 4, 2010, at 13:13 , Mariano Martinez Peck wrote:
>>
>>>>>
>>>>> Now...the question is, is there another free bit in the object header ?
>> I
>>>>> need another one :(
>>>>
>>>> Based on the comment at the bottom of Interpreter>>internalIsImmutable:
>>>> I suspect that somebody else has their eye on that last available bit
>>>> also ;-)
>>>>
>>>>
>>> Yes, I know :( � But for the moment I don't care to "integrate" my stuff.
>> I
>>> just want to play and experiment. And even for that, I need 2 bits :(
>>> Of course, if I once make something good to integrate, I will have double
>>> problem :(
>>>
>>> So...no solution ?
>>
>>