On Tue, Feb 14, 2017 at 9:54 PM, Pavel Krivanek <pavel.krivanek@gmail.com> wrote:
> Hi,
>
> It is very common to see in actively used images that the number of
> instances of Point is very high. Sometimes in order of hundreds of
> thousands. There is several reasons for that:
>
> Pharo every few milliseconds checks for the new display size. That check
> generates two instances of Point that are not garbage collected in
> reasonably short time. So if you periodically check the result of "Point
> allInstances size", you will see that it is quickly growing.
> On the other hand. That Point instances are not referenced by anyone so as
> soon as you do Smalltalk garbageCollect, the amount of Points in reduced.
> And they are correctly garbage collected by the VM after some time which is
> often longer than one minute. So no action needed.

Even though these get cleared out, its still extra work for the GC.�� Presumably most of the time the display size is identical to the last one, so I wonder if the existing screen size might be passed to the primitive to test and avoid creating a new new point if its the same.�� Off the top of my head, something like this (untested)... ��

�� MorphicUIManager >> checkForNewDisplaySize
Display hasScreenSizeChanged ifFalse: [^ Display].
DisplayScreen startUp.
World restoreMorphicDisplay.

�� DisplayScreen >> hasScreenSizeChanged
�� �� �� ^self class isActualScreenSizeX: width Y: height.

�� DisplayScreen class >> isActualScreenSizeX: width Y: height
�� �� �� <primitive: 106>

�� InterpreterPrimitives >> primitiveScreenSize "primitive 106"
�� �� �� �� "no arguments(original) ==> DisplayScreen_class>>actualScreenSize ;��returning new Point from ioScreenSIze "
�� �� �� �� "two arguments ==> DisplayScreen_class>>isActualyScreenSizeX;Y: ; returning Boolean of whether X,Y match ioScreenSize"��
| pointWord x y|
pointWord := self ioScreenSize.
x := pointWord >> 16 bitAnd: 65535.
y := pointWord bitAnd: 65535.
argumentCount = 2 ifTrue: [
((x = (self stackValue: 1)) and: [y = (self stackTop)])��
ifTrue: [self pop: 3 thenPush: objectMemory trueObject]��
ifFalse: [self pop: 3 thenPush: objectMemory trueObject].
].
self pop: 1 thenPush: (self makePointwithxValue: x �� ��yValue: y)

<snipped other sources of Points>
cheers -ben