2010/9/21 Henrik Sperre Johansen <henrik.s.johansen@veloxit.no>
On 21.09.2010 20:47, Mariano Martinez Peck wrote:


On Tue, Apr 27, 2010 at 1:19 PM, Adrian Lienhard <adi@netstyle.ch> wrote:
Its a simple method in Object:

Object>>sizeInMemory
� � � �"Returns the number of bytes used by this object in memory (including its header)"

� � � �| headerSize instanceSize |
� � � �headerSize := (self class indexIfCompact > 0 ifTrue: [ 4 ] ifFalse: [ 8 ]).
� � � �instanceSize := (self class isVariable
� � � � � � � �ifFalse: [ self class instSize * Smalltalk wordSize ]
� � � � � � � �ifTrue: [ (self basicSize * (self class isBytes
� � � � � � � � � � � �ifTrue: [ 1 ] ifFalse: [ Smalltalk wordSize ])) ]).
� � � �^ headerSize + instanceSize


� � �� ^ headerSize + contentBytes

:)

Thanks Henry....so do you think we can integrate this?

Adrian?


Hi Adrian. Sorry for returning to this thread. I am trying to contemplate all the cases.

I was looking at SpaceTally and I found that maybe a better implementation could be something like this:

Object >> sizeInMemory
��� "Answer the number of bytes consumed by this instance including object header."

��� | isCompact instVarBytes bytesPerElement headerBytes total contentBytes |
��� isCompact := self class indexIfCompact > 0.
��� instVarBytes := self class instSize * 4.
��� self class isVariable
��� ��� ifTrue: [
��� ��� ��� bytesPerElement := self class isBytes ifTrue: [1] ifFalse: [4].
��� ��� ��� total := 0.
��� ��� ��� contentBytes := instVarBytes + (self basicSize * bytesPerElement).
��� ��� ��� ��� headerBytes :=
��� ��� ��� ��� ��� contentBytes > 255
��� ��� ��� ��� ��� ��� ifTrue: [12]
��� ��� ��� ��� ��� ��� ifFalse: [isCompact ifTrue: [4] ifFalse: [8]].
��� ��� ��� ��� total :=� headerBytes + contentBytes.
��� ��� ��� ^ total]
��� ��� ifFalse: [
��� ��� ��� headerBytes :=
��� ��� ��� ��� instVarBytes > 255
��� ��� ��� ��� ��� ifTrue: [12]
��� ��� ��� ��� ��� ifFalse: [isCompact ifTrue: [4] ifFalse: [8]].
��� ��� ��� ^ headerBytes + instVarBytes ].



I guess I did some mistake but if we can arrive to a good implementation it would be really cool.

Thanks

mariano

Please, at least do some refactoring :)

Object >> sizeInMemory
��� "Answer the number of bytes consumed by this instance including object header."
��� | isCompact headerBytes contentBytes |

��� isCompact := self class indexIfCompact > 0.
��� contentBytes := self class instSize * Smalltalk wordSize. "inst vars"

��� self class isVariable ifTrue:
��� ��� [ |bytesPerElement|
��� ��� ��� bytesPerElement := self class isBytes ifTrue: [1] ifFalse: [4].
��� ��� ��� contentBytes := contentBytes + (self basicSize * bytesPerElement)].

��� � headerBytes :=
��� ��� ��� ��� ��� contentBytes > 255
��� ��� ��� ��� ��� ��� ifTrue: [12]
��� ��� ��� ��� ��� ��� ifFalse: [isCompact ifTrue: [4] ifFalse: [8]].
��� ��� ��� ^ headerBytes + instVarBytes

Also, in a 64-bit image, I suspect you may have to make a distinction between class isWords as well.
ie:
self class isBytes ifTrue: [1] ifFalse: [self class isWords ifTrue: [4] ifFalse: [Smalltalk wordSize]]

Cheers,
Henry

_______________________________________________
Pharo-project mailing list
Pharo-project@lists.gforge.inria.fr
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project