On 21.09.2010 20:47, Mariano Martinez Peck wrote:
On Tue, Apr 27, 2010 at 1:19 PM, Adrian Lienhard <[email protected]
<mailto:[email protected]>> 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
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
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project