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 <[email protected]> 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 <[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
>
_______________________________________________
Pharo-project mailing list
[email protected]
http://lists.gforge.inria.fr/cgi-bin/mailman/listinfo/pharo-project