Thanks Adrian for the feedback. I agree with your comments. What about this now:
sizeInMemory "Answer the number of bytes consumed by this instance including object header." | isCompact headerBytes contentBytes | (self isMemberOf: SmallInteger) ifTrue: [^0]. self class isVariable ifTrue: [ | bytesPerElement | bytesPerElement := self class isBytes ifTrue: [1] ifFalse: [4]. contentBytes := (self basicSize * bytesPerElement).] ifFalse: [ contentBytes := self class instSize * Smalltalk wordSize.]. isCompact := self class indexIfCompact > 0. headerBytes := contentBytes > 255 ifTrue: [3 * Smalltalk wordSize] ifFalse: [isCompact ifTrue: [Smalltalk wordSize] ifFalse: [2 * Smalltalk wordSize]]. ^ headerBytes + contentBytes is it better? cheers Mariano On Wed, Sep 22, 2010 at 9:59 AM, Adrian Lienhard <a...@netstyle.ch> wrote: > 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 <henrik.s.johan...@veloxit.no> > > > >> On 21.09.2010 20:47, Mariano Martinez Peck wrote: > >> > >> > >> > >> On Tue, Apr 27, 2010 at 1:19 PM, Adrian Lienhard <a...@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 > >> > > _______________________________________________ > > Pharo-project mailing list > > Pharo-project@lists.gforge.inria.fr > > http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project > > > _______________________________________________ > Pharo-project mailing list > Pharo-project@lists.gforge.inria.fr > http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project >
_______________________________________________ Pharo-project mailing list Pharo-project@lists.gforge.inria.fr http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project