Hi,
Magritte and my TagLengthValue (TLV) both use >>#instVarNamed:/>>#instVarNamed:put: to read and write from an object. I was just running >>#bench on my SMPP library and noticed that besides Spur Pharo5 is slower than Pharo3.
I added this to PointerLayout:
>># instVarIndexFor: aString ifAbsent: aBlockClosure
�� �� �� �� | idx |
�� �� �� �� idx := 1.
�� �� �� �� slotScope do: [:each |
�� �� �� �� �� �� �� �� each isVisible ifTrue: [
�� �� �� �� �� �� �� �� �� �� �� �� each name = aString ifTrue: [^idx].
�� �� �� �� �� �� �� �� �� �� �� �� idx := idx +1]].
�� �� �� �� ^aBlockClosure value
and modified ClassDescription/TClassDescription to use it:
"protocol: instance variables"
instVarIndexFor: instVarName ifAbsent: aBlock
�� �� �� �� "Answer the index of the named instance variable."
�� �� �� �� | index |
�� �� �� �� index := self classLayout instVarIndexFor: instVarName ifAbsent: [0].
�� �� �� �� index = 0 ifTrue:
�� �� �� �� �� �� �� �� [^self superclass == nil
�� �� �� �� �� �� �� �� �� �� �� �� ifTrue: [aBlock value]
�� �� �� �� �� �� �� �� �� �� �� �� ifFalse: [self superclass instVarIndexFor: instVarName ifAbsent: aBlock]].
�� �� �� �� ^self superclass == nil
�� �� �� �� �� �� �� �� ifTrue: [index]
�� �� �� �� �� �� �� �� ifFalse: [index + self superclass instSize]
The speed-up comes from filtering allSlots to allVisibleSlots (and creating an Array), then collecting the slot names and finally searching the name. Does it make sense to integrate such speed-ups?
cheers
�� �� �� �� holger