Some notes: - What should be answered for small ints? 1 sizeInMemory -->8. That's wrong. Shouldn't this answer 0?
- In the line contentBytes := contentBytes + (self basicSize * bytesPerElement), why is contentBytes added because it should be always 0 because self class instSize should return 0 in case of variable classes. Or do I miss something? - Please remove the inline comment "inst vars"; if a comment is needed it should go into the main comment. Adrian On Sep 21, 2010, at 22:14 , Mariano Martinez Peck wrote: > 2010/9/21 Henrik Sperre Johansen <[email protected]> > >> On 21.09.2010 20:47, Mariano Martinez Peck wrote: >> >> >> >> On Tue, Apr 27, 2010 at 1:19 PM, Adrian Lienhard <[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 >>> >>> > ^ 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 >> [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
