Instrumenting Send and what is
StrikeFontSet>displayString:on:from:to:at:kern:baselineY: doing?
John M McIntosh
johnmci at smalltalkconsulting.com
Sat Oct 29 07:54:56 UTC 2005
Michael was sitting in my living room this evening and we were
discussion performance issues and I was musing about adding an
instrumentation printf to the Squeak VM
to grab the method name on each execution of a message send. That way
we *know* what messages are being sent in which order. So I decided
to code up a test macintosh
carbon VM that is found at hftp://ftp.smalltalkconsulting.com/
experimental/SqueakMethodTrace3.8.9b7.app.zip which dumps data to
'messageTraceFile.txt'
One of the things I saw a lot of when opening an image, which
generates 40MB of data, is this sequence.
Process context Increment GC count method
107493580 111893480 16 StrikeFontSet>glyphInfoOf:into:
107493580 111893572 16 StrikeFont>ascentOf:
107493580 111893940 16 StrikeFont>hasGlyphOf:
107493580 111894032 16 Character>charCode
107493580 111893940 16 StrikeFont>hasGlyphOf:
107493580 111893940 16 StrikeFont>hasGlyphOf:
107493580 111894032 16 Magnitude>between:and:
107493580 111893940 16 StrikeFont>hasGlyphOf:
107493580 111893572 16 StrikeFont>ascentOf:
107493580 111893480 16 SequenceableCollection>first
107493580 111893480 16 SequenceableCollection>first
107493580 111893480 16 SequenceableCollection>second
107493580 111893572 16 SequenceableCollection>checkedAt:
107493580 111893572 16 SequenceableCollection>checkedAt:
107493580 111893480 16 SequenceableCollection>third
107493580 111893572 16 SequenceableCollection>checkedAt:
107493580 111893572 16 SequenceableCollection>checkedAt:
107493580 111893480 16 SequenceableCollection>fifth
107493580 111893572 16 SequenceableCollection>checkedAt:
107493580 111893572 16 SequenceableCollection>checkedAt:
what is interesting is that
StrikeFontSet>displayString:on:from:to:at:kern:baselineY:
does
self glyphInfoOf: (aString at: charIndex) into: glyphInfo.
g := glyphInfo first.
leftX := glyphInfo second.
rightX := glyphInfo third.
(glyphInfo fifth ~= aBitBlt lastFont) ifTrue: [
glyphInfo fifth installOn: aBitBlt.
].
Now for example SquenceableCollection>>fifth
"Answer the fifth element of the receiver.
Raise an error if there are not enough elements."
^ self checkedAt: 5
which does
SquenceableCollection>>checkedAt: index
index > self size ifTrue: [self error: 'not enough elements'].
^ self at: index
which does the at: index which would in fact toss an
self errorSubscriptBounds:
when the primitive discovers a range check issue.
So do we need the checkedAt: logic?
Could we just not say
fifth
^self at: 5
Of course saying (self at: 5) in
displayString:on:from:to:at:kern:baselineY: would be way more efficient.
Other fun things like
Rectangle>insetBy:
invokes isKindOf:
versus saying isThisARectangle or something...
String>convertFromWithConverter:
is quite message sending happy.
--
========================================================================
===
John M. McIntosh <johnmci at smalltalkconsulting.com> 1-800-477-2659
Corporate Smalltalk Consulting Ltd. http://www.smalltalkconsulting.com
========================================================================
===
More information about the Squeak-dev
mailing list
|