may be compare with the vw version
I remember that lomg time ago in book of the guy doing june
there was some code to do that

http://www.sra.co.jp/people/aoki/
        in freedocument
        then    Smalltalk Idioms in English
        then chapter 3
Here let me introduce a program that finds the size in bytes of an arbitrary object. Finding the size of an object is the quickest route toward understanding the internal structure of objects.

"Calculate the size in bytes of an arbitrary object."
| byteSizeOfObject | byteSizeOfObject := [:anObject | | bytesInOTE bytesInOOP aClass indexableFieldSize instVarFieldSize byteSize | bytesInOTE := ObjectMemory current bytesPerOTE. bytesInOOP := ObjectMemory current bytesPerOOP. aClass := anObject class. aClass isPointers ifTrue: [instVarFieldSize := aClass instSize * bytesInOOP. aClass isVariable ifTrue: [indexableFieldSize := anObject basicSize * bytesInOOP] ifFalse: [indexableFieldSize := 0]] ifFalse: [instVarFieldSize := 0. aClass isVariable ifTrue: [indexableFieldSize := anObject basicSize + (bytesInOOP - 1) bitAnd: bytesInOOP negated] ifFalse: [indexableFieldSize := 0. aClass hasImmediateInstances ifTrue: [bytesInOTE := 0]]]. byteSize := bytesInOTE + instVarFieldSize + indexableFieldSize. byteSize yourself]. ^byteSizeOfObject value: (OrderedCollection new: 10)
have a look at the book.




now in VW

numOopsNumBytes
        "Answer an Array containing the number of objects in the system
        and the number of bytes they occupy. This method is implementation
        dependent."
        "ObjectMemory current numOopsNumBytes"

        | nobjects nbytes class bytesInHeader bytesInOOP |
        nobjects := nbytes := 0.
        bytesInHeader := self bytesPerOTE.
        bytesInOOP := self bytesPerOOP.
        self class allObjectsDo:
                [:object |
                nobjects := nobjects + 1.
                nbytes := nbytes + bytesInHeader.
                (class := object class) isBits
ifTrue: [nbytes := nbytes + (object basicSize + (bytesInOOP - 1) bitAnd: bytesInOOP negated)]
                        ifFalse:
                                [nbytes := nbytes + (class instSize * 
bytesInOOP).
class isVariable ifTrue: [nbytes := nbytes + (object basicSize * bytesInOOP)]]].
        ^Array with: nobjects with: nbytes


On Oct 21, 2008, at 6:15 PM, Adrian Lienhard wrote:

Hi Frédéric

Nice to see you on the Pharo mailing list!

Just the other day I needed this too and I implemented the following method:

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


BTW, I think that would be a meaningful addition. Could somebody quickly check the method to verify that I didn't do any miscalculation?

Cheers,
Adrian

On Oct 21, 2008, at 17:58 , Frederic Pluquet wrote:

Hello,

For an experimentation, I need to know the size in bytes of any object. Is there a way to obtain this information in Pharo ?

Fréd

--
Frédéric Pluquet
Université Libre de Bruxelles (ULB)
Assistant
http://www.ulb.ac.be/di/fpluquet
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project


_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project



_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project

Reply via email to