Poor TTF font performance on Linux with newer VM

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
8 messages Options
Reply | Threaded
Open this post in threaded view
|

Poor TTF font performance on Linux with newer VM

Tony Garnock-Jones-2
Hi all,

I have recently been building VMs on Linux (to fix a bug in the
FilePlugin), and with my shiny new patched 3.9-7 VM (build from the head
of svn plus my patch) the TTF font performance (Bitstream Vera Sans) has
dropped through the floor.

I'm using a BookMorph with lots of Bitstream text morphs, and switching
pages causes the CPU to peg at 100% in Squeak for several seconds.

Switching back to a 3.7-7 VM causes the font rendering to run at normal
speed again - even when I take a 3.7-7 source tree, patch it to fix the
FilePlugin bug, and recompile.

So - it looks like something between 3.7-7 and 3.9-7 causes the TTF
performance to bottom out. What could it be? Any ideas?

Tony

PS. all this is on Debian, gcc 4.0.4, and I could be wrong about
identifying font rendering as the problem area. I know Squeak suddenly
seems to take a looooong time to do anything TTF related - strike fonts
seem to run at normal speed.

--
 [][][] Tony Garnock-Jones     | Mob: +44 (0)7905 974 211
   [][] LShift Ltd             | Tel: +44 (0)20 7729 7060
 []  [] http://www.lshift.net/ | Email: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Poor TTF font performance on Linux with newer VM

David T. Lewis
On Thu, May 18, 2006 at 10:40:58AM +0100, Tony Garnock-Jones wrote:

> Hi all,
>
> I have recently been building VMs on Linux (to fix a bug in the
> FilePlugin), and with my shiny new patched 3.9-7 VM (build from the head
> of svn plus my patch) the TTF font performance (Bitstream Vera Sans) has
> dropped through the floor.
>
> I'm using a BookMorph with lots of Bitstream text morphs, and switching
> pages causes the CPU to peg at 100% in Squeak for several seconds.
>
> Switching back to a 3.7-7 VM causes the font rendering to run at normal
> speed again - even when I take a 3.7-7 source tree, patch it to fix the
> FilePlugin bug, and recompile.
>
> So - it looks like something between 3.7-7 and 3.9-7 causes the TTF
> performance to bottom out. What could it be? Any ideas?
>
> Tony
>
> PS. all this is on Debian, gcc 4.0.4, and I could be wrong about
> identifying font rendering as the problem area. I know Squeak suddenly
> seems to take a looooong time to do anything TTF related - strike fonts
> seem to run at normal speed.

I don't know the answer to your question, but from what you're
describing I might guess the TTF font rendering uses some plugin
that is missing from your new VM. Check "Smalltalk listLoadedModules"
on your 3.7-7 VM (after doing something with your BookMorph) and
see if it shows some plugin that you have not included in your
3.9-7 build.

Dave


Reply | Threaded
Open this post in threaded view
|

Re: Poor TTF font performance on Linux with newer VM

Tony Garnock-Jones-2
Thanks for that - I had suspected it might be a plugin. I've followed
your suggestion, and the plugin list is almost identical except for
OSProcess and FFI plugins.

I've just run "MessageTally spyOn: [3 timesRepeat: [self nextPage]]" on
my BookMorph. The two results are dramatically different: on the 3.7 VM,
477ms for the whole thing; on the 3.9 VM, 50354ms for the whole thing! A
factor of 100x slower.

I've attached the traces, in case they're meaningful at a glance to
anyone reading.

Regards,
  Tony

David T. Lewis wrote:

> On Thu, May 18, 2006 at 10:40:58AM +0100, Tony Garnock-Jones wrote:
>> Hi all,
>>
>> I have recently been building VMs on Linux (to fix a bug in the
>> FilePlugin), and with my shiny new patched 3.9-7 VM (build from the head
>> of svn plus my patch) the TTF font performance (Bitstream Vera Sans) has
>> dropped through the floor.
>>
>> I'm using a BookMorph with lots of Bitstream text morphs, and switching
>> pages causes the CPU to peg at 100% in Squeak for several seconds.
>>
>> Switching back to a 3.7-7 VM causes the font rendering to run at normal
>> speed again - even when I take a 3.7-7 source tree, patch it to fix the
>> FilePlugin bug, and recompile.
>>
>> So - it looks like something between 3.7-7 and 3.9-7 causes the TTF
>> performance to bottom out. What could it be? Any ideas?
>>
>> Tony
>>
>> PS. all this is on Debian, gcc 4.0.4, and I could be wrong about
>> identifying font rendering as the problem area. I know Squeak suddenly
>> seems to take a looooong time to do anything TTF related - strike fonts
>> seem to run at normal speed.
>
> I don't know the answer to your question, but from what you're
> describing I might guess the TTF font rendering uses some plugin
> that is missing from your new VM. Check "Smalltalk listLoadedModules"
> on your 3.7-7 VM (after doing something with your BookMorph) and
> see if it shows some plugin that you have not included in your
> 3.9-7 build.
>
> Dave
>
>
>

--
 [][][] Tony Garnock-Jones     | Mob: +44 (0)7905 974 211
   [][] LShift Ltd             | Tel: +44 (0)20 7729 7060
 []  [] http://www.lshift.net/ | Email: [hidden email]

 - 461 tallies, 477 msec.

**Tree**
100.0% {477ms} BookMorph>>nextPage
  100.0% {477ms} BookMorph>>goToPage:
    100.0% {477ms} BookMorph>>goToPage:transitionSpec:
      100.0% {477ms} BookMorph>>goToPageMorph:transitionSpec:
        57.7% {275ms} PasteUpMorph>>displayWorld
          |57.7% {275ms} PasteUpMorph>>privateOuterDisplayWorld
          |  57.7% {275ms} WorldState>>displayWorld:submorphs:
          |    57.7% {275ms} WorldState>>drawWorld:submorphs:invalidAreasOn:
          |      57.7% {275ms} FormCanvas(Canvas)>>fullDrawMorph:
          |        57.7% {275ms} FormCanvas(Canvas)>>fullDraw:
          |          57.7% {275ms} BookMorph(Morph)>>fullDrawOn:
          |            57.7% {275ms} BookMorph(Morph)>>drawSubmorphsOn:
          |              57.7% {275ms} FormCanvas(Canvas)>>fullDrawMorph:
          |                57.7% {275ms} FormCanvas(Canvas)>>fullDraw:
          |                  57.7% {275ms} PasteUpMorph(Morph)>>fullDrawOn:
          |                    52.3% {249ms} PasteUpMorph>>drawSubmorphsOn:
          |                      |52.3% {249ms} FormCanvas(Canvas)>>fullDrawMorph:
[52.3% {249ms} FormCanvas(Canvas)>>fullDraw:
[  52.3% {249ms} TextMorph(Morph)>>fullDrawOn:
[    52.3% {249ms} FormCanvas(Canvas)>>drawMorph:
[      52.3% {249ms} FormCanvas(Canvas)>>draw:
[        52.3% {249ms} TextMorph>>drawOn:
[          30.6% {146ms} FormCanvas>>paragraph:bounds:color:
[            |30.6% {146ms} MultiNewParagraph>>displayOn:using:at:
[            |  30.6% {146ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
[            |    27.1% {129ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
[            |      19.3% {92ms} TTCFont>>glyphInfoOf:into:
[            |        |11.3% {54ms} TTCFont>>ascentOf:
[            |        |  |11.3% {54ms} TTCFont>>ascent
[            |        |  |  6.7% {32ms} TTCFont>>pixelSize
[            |        |  |    |6.7% {32ms} TextStyle class>>pointsToPixels:
[            |        |  |    |  6.7% {32ms} TextStyle class>>pixelsPerInch
[            |        |  |    |    6.7% {32ms} Dictionary>>at:ifAbsentPut:
[            |        |  |    |      5.2% {25ms} Dictionary>>at:ifAbsent:
[[3.0% {14ms} primitives
[[2.2% {10ms} Dictionary(Set)>>findElementOrNil:
[[  2.2% {10ms} Dictionary>>scanFor:
[[    2.2% {10ms} ByteSymbol(String)>>hash
[            |        |  |  4.6% {22ms} Float(Number)>>//
[            |        |  |    3.0% {14ms} primitives
[            |        |8.0% {38ms} TTCFont>>formOf:
[            |        |  8.0% {38ms} TTCFont>>computeForm:
[            |        |    6.3% {30ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[            |        |      6.3% {30ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[            |        |        6.3% {30ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
[            |        |          5.0% {24ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
[            |        |            3.0% {14ms} BalloonCanvas>>ensuredEngine
[[3.0% {14ms} BalloonEngine class(Behavior)>>new
[[  3.0% {14ms} BalloonEngine>>initialize
[[    3.0% {14ms} BalloonEngine>>bitBlt:
[            |      2.8% {13ms} primitives
[          21.7% {104ms} TextMorph>>paragraph
[            21.7% {104ms} MultiNewParagraph(NewParagraph)>>compose:style:from:in:
[              21.7% {104ms} MultiNewParagraph(NewParagraph)>>composeAll
[                21.7% {104ms} MultiNewParagraph(NewParagraph)>>composeLinesFrom:to:delta:into:priorLines:atY:
[                  21.7% {104ms} TextComposer>>composeLinesFrom:to:del...ner:wantsColumnBreaks:
[                    21.7% {104ms} TextComposer>>composeAllLines
[                      21.7% {104ms} TextComposer>>composeOneLine
[                        21.7% {104ms} TextComposer>>composeAllRectangles:
[                          21.7% {104ms} TextComposer>>composeEachRectangleIn:
[                            21.7% {104ms} CompositionScanner>>composeFrom:inRectan...leftSide:rightSide:
[                              19.7% {94ms} CompositionScanner(CharacterScanner)>>scanCharactersFrom:to...stopConditions:kern:
[                                19.7% {94ms} CompositionScanner(CharacterScanner)>>basicScanCharactersFr...stopConditions:kern:
[[19.7% {94ms} TTCFont>>widthOf:
[[  19.7% {94ms} TTCFont>>computeForm:
[[    17.6% {84ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[[      |17.6% {84ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[[      |  17.6% {84ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
[[      |    12.6% {60ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
[[      |      |9.1% {43ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
[[      |      |  |4.8% {23ms} BalloonEngine>>postFlushIfNeeded
[[      |      |  |  |4.8% {23ms} BalloonEngine>>copyBits
[[      |      |  |  |  4.8% {23ms} BalloonEngine>>copyLoopFaster
[[      |      |  |4.3% {21ms} BalloonEngine>>registerFill:and:
[[      |      |  |  4.3% {21ms} BalloonEngine>>registerFills:
[[      |      |  |    2.4% {11ms} BalloonEngine>>registerFill:
[[      |      |3.5% {17ms} BalloonCanvas>>ensuredEngine
[[      |    5.0% {24ms} MatrixTransform2x3 class>>withScale:
[[    2.2% {10ms} TTCFont>>pixelSize
[[      2.2% {10ms} TextStyle class>>pointsToPixels:
[[        2.2% {10ms} TextStyle class>>pixelsPerInch
[[          2.2% {10ms} Dictionary>>at:ifAbsentPut:
[[            2.2% {10ms} Dictionary>>at:ifAbsent:
[[              2.2% {10ms} Dictionary(Set)>>findElementOrNil:
[[                2.2% {10ms} Dictionary>>scanFor:
[[                  2.2% {10ms} ByteSymbol(String)>>hash
[[                    2.2% {10ms} ByteString class(Object)>>hash
          |                    2.8% {13ms} FormCanvas(Canvas)>>drawMorph:
          |                      2.8% {13ms} FormCanvas(Canvas)>>draw:
[2.8% {13ms} PasteUpMorph>>drawOn:
[  2.8% {13ms} PasteUpMorph(Morph)>>drawOn:
[    2.8% {13ms} FormCanvas(Canvas)>>fillRectangle:fillStyle:borderStyle:
[      2.8% {13ms} FormCanvas>>fillRectangle:fillStyle:
[        2.8% {13ms} FormCanvas>>balloonFillRectangle:fillStyle:
[          2.8% {13ms} BalloonCanvas>>fillRectangle:fillStyle:
[            2.8% {13ms} BalloonCanvas>>drawRectangle:color:borderWidth:borderColor:
[              2.8% {13ms} BalloonEngine>>drawRectangle:fill:bor...borderColor:transform:
[                2.8% {13ms} BalloonEngine>>postFlushIfNeeded
[                  2.8% {13ms} BalloonEngine>>copyBits
[                    2.8% {13ms} BalloonEngine>>copyLoopFaster
        38.8% {185ms} PasteUpMorph(Morph)>>updateCachedThumbnail
          |38.8% {185ms} BookPageThumbnailMorph>>computeThumbnail
          |  38.8% {185ms} PasteUpMorph(Morph)>>imageForm
          |    38.8% {185ms} PasteUpMorph(Morph)>>imageFormForRectangle:
          |      38.8% {185ms} PasteUpMorph(Morph)>>imageForm:forRectangle:
          |        38.8% {185ms} FormCanvas(Canvas)>>fullDrawMorph:
          |          38.8% {185ms} FormCanvas(Canvas)>>fullDraw:
          |            38.8% {185ms} PasteUpMorph(Morph)>>fullDrawOn:
          |              31.2% {149ms} PasteUpMorph>>drawSubmorphsOn:
          |                |31.2% {149ms} FormCanvas(Canvas)>>fullDrawMorph:
          |                |  31.2% {149ms} FormCanvas(Canvas)>>fullDraw:
          |                |    31.2% {149ms} TextMorph(Morph)>>fullDrawOn:
          |                |      31.2% {149ms} FormCanvas(Canvas)>>drawMorph:
[31.2% {149ms} FormCanvas(Canvas)>>draw:
[  31.2% {149ms} TextMorph>>drawOn:
[    31.2% {149ms} FormCanvas>>paragraph:bounds:color:
[      31.2% {149ms} MultiNewParagraph>>displayOn:using:at:
[        31.2% {149ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
[          28.2% {135ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
[            19.1% {91ms} TTCFont>>glyphInfoOf:into:
[              |17.6% {84ms} TTCFont>>ascentOf:
[              |  17.6% {84ms} TTCFont>>ascent
[              |    15.0% {72ms} TTCFont>>pixelSize
[              |      |15.0% {72ms} TextStyle class>>pointsToPixels:
[              |      |  15.0% {72ms} TextStyle class>>pixelsPerInch
[              |      |    15.0% {72ms} Dictionary>>at:ifAbsentPut:
[              |      |      13.2% {63ms} Dictionary>>at:ifAbsent:
[              |      |        8.9% {42ms} primitives
[              |      |        4.3% {21ms} Dictionary(Set)>>findElementOrNil:
[              |      |          2.4% {11ms} Dictionary>>scanFor:
[              |    2.6% {12ms} Float(Number)>>//
[            4.8% {23ms} GrafPort(BitBlt)>>sourceForm:
[            2.8% {13ms} primitives
          |              7.6% {36ms} FormCanvas(Canvas)>>drawMorph:
          |                7.6% {36ms} FormCanvas(Canvas)>>draw:
          |                  7.6% {36ms} PasteUpMorph>>drawOn:
          |                    7.6% {36ms} PasteUpMorph(Morph)>>drawOn:
          |                      7.6% {36ms} FormCanvas(Canvas)>>fillRectangle:fillStyle:borderStyle:
[7.6% {36ms} FormCanvas>>fillRectangle:fillStyle:
[  7.6% {36ms} FormCanvas>>balloonFillRectangle:fillStyle:
[    7.6% {36ms} BalloonCanvas>>fillRectangle:fillStyle:
[      7.6% {36ms} BalloonCanvas>>drawRectangle:color:borderWidth:borderColor:
[        7.6% {36ms} BalloonEngine>>drawRectangle:fill:bor...borderColor:transform:
[          7.6% {36ms} BalloonEngine>>postFlushIfNeeded
[            7.6% {36ms} BalloonEngine>>copyBits
[              7.6% {36ms} BalloonEngine>>copyLoopFaster
        3.5% {17ms} PasteUpMorph>>startSteppingSubmorphsOf:
          3.5% {17ms} PasteUpMorph(Morph)>>arrangeToStartSteppingIn:

**Leaves**
16.9% {81ms} BalloonEngine>>copyLoopFaster
13.2% {63ms} Dictionary>>at:ifAbsent:
6.5% {31ms} GrafPort(BitBlt)>>sourceForm:
5.6% {27ms} Float(Number)>>//
5.6% {27ms} Array(SequenceableCollection)>>do:
5.6% {27ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
5.0% {24ms} MatrixTransform2x3 class>>withScale:
3.7% {18ms} Dictionary(Set)>>findElementOrNil:
3.5% {17ms} Float(Number)>>floor
3.5% {17ms} Rectangle>>setOrigin:corner:
3.3% {16ms} Dictionary>>at:ifAbsentPut:
3.3% {16ms} ByteString class(Object)>>hash
3.3% {16ms} GrafPort(BitBlt)>>sourceOrigin:
3.0% {14ms} Point>>extent:
2.4% {11ms} BalloonEngine>>registerFill:
2.2% {10ms} ByteSymbol(String)>>hash

**Memory**
        old +832,264 bytes
        young -549,516 bytes
        used +282,748 bytes
        free -282,748 bytes

**GCs**
        full 0 totalling 0ms (0.0% uptime)
        incr 47 totalling 37ms (8.0% uptime), avg 1.0ms
        tenures 1 (avg 47 GCs/tenure)
        root table 0 overflows

 - 50151 tallies, 50354 msec.

**Tree**
100.0% {50354ms} BookMorph>>nextPage
  100.0% {50354ms} BookMorph>>goToPage:
    100.0% {50354ms} BookMorph>>goToPage:transitionSpec:
      100.0% {50354ms} BookMorph>>goToPageMorph:transitionSpec:
        61.2% {30817ms} PasteUpMorph(Morph)>>updateCachedThumbnail
          |61.2% {30817ms} BookPageThumbnailMorph>>computeThumbnail
          |  61.2% {30817ms} PasteUpMorph(Morph)>>imageForm
          |    61.2% {30817ms} PasteUpMorph(Morph)>>imageFormForRectangle:
          |      61.2% {30817ms} PasteUpMorph(Morph)>>imageForm:forRectangle:
          |        61.2% {30817ms} FormCanvas(Canvas)>>fullDrawMorph:
          |          61.2% {30817ms} FormCanvas(Canvas)>>fullDraw:
          |            61.2% {30817ms} PasteUpMorph(Morph)>>fullDrawOn:
          |              61.2% {30817ms} PasteUpMorph>>drawSubmorphsOn:
          |                61.2% {30817ms} FormCanvas(Canvas)>>fullDrawMorph:
          |                  61.2% {30817ms} FormCanvas(Canvas)>>fullDraw:
          |                    61.2% {30817ms} TextMorph(Morph)>>fullDrawOn:
          |                      61.1% {30766ms} FormCanvas(Canvas)>>drawMorph:
[61.1% {30766ms} FormCanvas(Canvas)>>draw:
[  61.1% {30766ms} TextMorph>>drawOn:
[    61.1% {30766ms} FormCanvas>>paragraph:bounds:color:
[      61.1% {30766ms} MultiNewParagraph>>displayOn:using:at:
[        61.1% {30766ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
[          29.2% {14703ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
[            |27.5% {13847ms} TTCFont>>glyphInfoOf:into:
[            |  20.0% {10071ms} TTCFont>>formOf:
[            |    |19.2% {9668ms} TTCFont>>computeForm:
[            |    |  17.8% {8963ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[            |    |    17.8% {8963ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[            |    |      17.8% {8963ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
[            |    |        10.5% {5287ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
[            |    |          |7.7% {3877ms} BalloonCanvas>>ensuredEngine
[            |    |          |  |7.6% {3827ms} BalloonEngine class(Behavior)>>new
[            |    |          |  |  7.6% {3827ms} BalloonEngine>>initialize
[            |    |          |  |    7.0% {3525ms} BitBlt class>>toForm:
[[6.7% {3374ms} primitives
[            |    |          |2.6% {1309ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
[            |    |        3.6% {1813ms} Form class>>extent:depth:
[            |    |          |3.6% {1813ms} Form>>setExtent:depth:
[            |    |          |  3.6% {1813ms} primitives
[            |    |        2.8% {1410ms} Form(DisplayMedium)>>fillColor:
[            |  6.6% {3323ms} TTCFont>>ascentOf:
[            |    6.6% {3323ms} TTCFont>>ascent
[            |      4.4% {2216ms} TTCFont>>pixelSize
[            |        |4.4% {2216ms} TextStyle class>>pointsToPixels:
[            |        |  4.4% {2216ms} TextStyle class>>pixelsPerInch
[            |        |    4.1% {2065ms} Dictionary>>at:ifAbsentPut:
[            |        |      4.1% {2065ms} Dictionary>>at:ifAbsent:
[            |        |        3.0% {1511ms} Dictionary(Set)>>findElementOrNil:
[            |        |          2.7% {1360ms} Dictionary>>scanFor:
[            |      2.2% {1108ms} Float(Number)>>//
[          28.0% {14099ms} MultiDisplayScanner(MultiCharacterScanner)>>scanCharactersFrom...opConditions:kern:
[            |28.0% {14099ms} MultiDisplayScanner(MultiCharacterScanner)>>basicScanCharacter...opConditions:kern:
[            |  28.0% {14099ms} TTCFont>>widthOf:
[            |    26.4% {13293ms} TTCFont>>computeForm:
[            |      25.8% {12991ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[            |        25.8% {12991ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[            |          25.8% {12991ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
[            |            19.8% {9970ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
[            |              |14.9% {7503ms} BalloonCanvas>>ensuredEngine
[            |              |  |14.2% {7150ms} BalloonEngine class(Behavior)>>new
[            |              |  |  14.2% {7150ms} BalloonEngine>>initialize
[            |              |  |    12.2% {6143ms} BitBlt class>>toForm:
[[12.2% {6143ms} primitives
[            |              |5.0% {2518ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
[            |              |  3.1% {1561ms} BalloonEngine>>registerFill:and:
[            |              |    3.1% {1561ms} BalloonEngine>>registerFills:
[            |              |      2.5% {1259ms} BalloonEngine>>registerFill:
[            |            2.8% {1410ms} Form(DisplayMedium)>>fillColor:
[          3.1% {1561ms} MultiDisplayScanner>>endOfRun
[            3.0% {1511ms} MultiDisplayScanner>>setStopConditions
[              3.0% {1511ms} MultiDisplayScanner>>setFont
[                3.0% {1511ms} MultiDisplayScanner(MultiCharacterScanner)>>setFont
[                  3.0% {1511ms} TTCFont>>widthOf:
[                    2.5% {1259ms} TTCFont>>computeForm:
[                      2.5% {1259ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[                        2.5% {1259ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[                          2.5% {1259ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
        38.2% {19235ms} PasteUpMorph>>displayWorld
          38.2% {19235ms} PasteUpMorph>>privateOuterDisplayWorld
            38.2% {19235ms} WorldState>>displayWorld:submorphs:
              38.2% {19235ms} WorldState>>drawWorld:submorphs:invalidAreasOn:
                38.2% {19235ms} FormCanvas(Canvas)>>fullDrawMorph:
                  38.2% {19235ms} FormCanvas(Canvas)>>fullDraw:
                    38.2% {19235ms} BookMorph(Morph)>>fullDrawOn:
                      38.2% {19235ms} BookMorph(Morph)>>drawSubmorphsOn:
                        38.2% {19235ms} FormCanvas(Canvas)>>fullDrawMorph:
                          38.2% {19235ms} FormCanvas(Canvas)>>fullDraw:
                            38.2% {19235ms} PasteUpMorph(Morph)>>fullDrawOn:
                              37.4% {18832ms} PasteUpMorph>>drawSubmorphsOn:
                                37.4% {18832ms} FormCanvas(Canvas)>>fullDrawMorph:
[37.4% {18832ms} FormCanvas(Canvas)>>fullDraw:
[  37.4% {18832ms} TextMorph(Morph)>>fullDrawOn:
[    37.3% {18782ms} FormCanvas(Canvas)>>drawMorph:
[      37.3% {18782ms} FormCanvas(Canvas)>>draw:
[        37.3% {18782ms} TextMorph>>drawOn:
[          30.7% {15459ms} FormCanvas>>paragraph:bounds:color:
[            |30.7% {15459ms} MultiNewParagraph>>displayOn:using:at:
[            |  30.7% {15459ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
[            |    16.1% {8107ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
[            |      |11.9% {5992ms} TTCFont>>glyphInfoOf:into:
[            |      |  6.9% {3474ms} TTCFont>>ascentOf:
[            |      |    |6.9% {3474ms} TTCFont>>ascent
[            |      |    |  4.7% {2367ms} TTCFont>>pixelSize
[            |      |    |    4.4% {2216ms} TextStyle class>>pointsToPixels:
[            |      |    |      4.4% {2216ms} TextStyle class>>pixelsPerInch
[            |      |    |        4.2% {2115ms} Dictionary>>at:ifAbsentPut:
[            |      |    |          3.6% {1813ms} Dictionary>>at:ifAbsent:
[            |      |  5.0% {2518ms} TTCFont>>formOf:
[            |      |    4.7% {2367ms} TTCFont>>computeForm:
[            |      |      3.8% {1913ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[            |      |        3.8% {1913ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[            |      |          3.8% {1913ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
[            |      |            2.1% {1057ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
[            |    11.3% {5690ms} MultiDisplayScanner(MultiCharacterScanner)>>scanCharactersFrom...opConditions:kern:
[            |      11.3% {5690ms} MultiDisplayScanner(MultiCharacterScanner)>>basicScanCharacter...opConditions:kern:
[            |        11.2% {5640ms} TTCFont>>widthOf:
[            |          11.2% {5640ms} TTCFont>>computeForm:
[            |            9.8% {4935ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[            |              9.8% {4935ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[            |                9.8% {4935ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
[            |                  5.8% {2921ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
[            |                    3.4% {1712ms} BalloonCanvas>>ensuredEngine
[            |                    2.4% {1208ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
[          6.6% {3323ms} TextMorph>>paragraph
[            6.6% {3323ms} MultiNewParagraph(NewParagraph)>>compose:style:from:in:
[              6.6% {3323ms} MultiNewParagraph(NewParagraph)>>composeAll
[                6.6% {3323ms} MultiNewParagraph(NewParagraph)>>composeLinesFrom:to:delta:into:priorLines:atY:
[                  6.6% {3323ms} TextComposer>>composeLinesFrom:to:del...ner:wantsColumnBreaks:
[                    6.6% {3323ms} TextComposer>>composeAllLines
[                      6.6% {3323ms} TextComposer>>composeOneLine
[                        6.6% {3323ms} TextComposer>>composeAllRectangles:
[                          6.6% {3323ms} TextComposer>>composeEachRectangleIn:
[                            6.4% {3223ms} CompositionScanner>>composeFrom:inRectan...leftSide:rightSide:
[                              6.1% {3072ms} CompositionScanner(CharacterScanner)>>scanCharactersFrom:to...stopConditions:kern:
[                                6.1% {3072ms} CompositionScanner(CharacterScanner)>>basicScanCharactersFr...stopConditions:kern:
[[6.1% {3072ms} TTCFont>>widthOf:
[[  5.8% {2921ms} TTCFont>>computeForm:
[[    4.6% {2316ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
[[      4.6% {2316ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
[[        4.6% {2316ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
[[          2.9% {1460ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:

**Leaves**
20.3% {10222ms} BitBlt class>>toForm:
6.1% {3072ms} Form>>setExtent:depth:
5.3% {2669ms} Rectangle>>setOrigin:corner:
3.6% {1813ms} Dictionary>>at:ifAbsent:
3.3% {1662ms} Point>>+
3.0% {1511ms} Dictionary>>scanFor:
3.0% {1511ms} Float(Number)>>//
2.8% {1410ms} Point>>*
2.5% {1259ms} Association>>key:value:
2.5% {1259ms} Form(DisplayMedium)>>fillColor:
2.2% {1108ms} Color>>pixelWordFor:filledWith:
2.2% {1108ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
2.1% {1057ms} BalloonEngine>>copyLoopFaster

**Memory**
        old +1,565,496 bytes
        young -1,278,376 bytes
        used +287,120 bytes
        free +1,279,316 bytes

**GCs**
        full 1 totalling 200ms (0.0% uptime), avg 200.0ms
        incr 518 totalling 1,117ms (2.0% uptime), avg 2.0ms
        tenures 2 (avg 259 GCs/tenure)
        root table 0 overflows


Reply | Threaded
Open this post in threaded view
|

Re: Poor TTF font performance on Linux with newer VM

Göran Krampe
Hi!

Tony Garnock-Jones <[hidden email]> wrote:
> Thanks for that - I had suspected it might be a plugin. I've followed
> your suggestion, and the plugin list is almost identical except for
> OSProcess and FFI plugins.
>
> I've just run "MessageTally spyOn: [3 timesRepeat: [self nextPage]]" on
> my BookMorph. The two results are dramatically different: on the 3.7 VM,
> 477ms for the whole thing; on the 3.9 VM, 50354ms for the whole thing! A
> factor of 100x slower.

Just wanted to mention that this might indeed be the issue I have been
experiencing with the new VM in my IRCe image - I thought it had to do
with Socket communication, but hey, it might as well be this in fact.

regards, Göran

Reply | Threaded
Open this post in threaded view
|

Re: Poor TTF font performance on Linux with newer VM

David T. Lewis
In reply to this post by Tony Garnock-Jones-2
Are you saying that your 3.9 VM does *not* have the FFI plugin? If
that is the case, try adding it to the build in case FFI is being
used for the TTF fonts in some way.

But your message tally seems to be pointing to BitBlt, which would
suggest the BitBltPlugin, but I don't think anything would be working
at all if BitBltPlugin was not working. That's all I can think of,
maybe someone else can spot what's wrong?

Dave

On Thu, May 18, 2006 at 11:53:55AM +0100, Tony Garnock-Jones wrote:

> Thanks for that - I had suspected it might be a plugin. I've followed
> your suggestion, and the plugin list is almost identical except for
> OSProcess and FFI plugins.
>
> I've just run "MessageTally spyOn: [3 timesRepeat: [self nextPage]]" on
> my BookMorph. The two results are dramatically different: on the 3.7 VM,
> 477ms for the whole thing; on the 3.9 VM, 50354ms for the whole thing! A
> factor of 100x slower.
>
> I've attached the traces, in case they're meaningful at a glance to
> anyone reading.
>
> Regards,
>   Tony
>
> David T. Lewis wrote:
> > On Thu, May 18, 2006 at 10:40:58AM +0100, Tony Garnock-Jones wrote:
> >> Hi all,
> >>
> >> I have recently been building VMs on Linux (to fix a bug in the
> >> FilePlugin), and with my shiny new patched 3.9-7 VM (build from the head
> >> of svn plus my patch) the TTF font performance (Bitstream Vera Sans) has
> >> dropped through the floor.
> >>
> >> I'm using a BookMorph with lots of Bitstream text morphs, and switching
> >> pages causes the CPU to peg at 100% in Squeak for several seconds.
> >>
> >> Switching back to a 3.7-7 VM causes the font rendering to run at normal
> >> speed again - even when I take a 3.7-7 source tree, patch it to fix the
> >> FilePlugin bug, and recompile.
> >>
> >> So - it looks like something between 3.7-7 and 3.9-7 causes the TTF
> >> performance to bottom out. What could it be? Any ideas?
> >>
> >> Tony
> >>
> >> PS. all this is on Debian, gcc 4.0.4, and I could be wrong about
> >> identifying font rendering as the problem area. I know Squeak suddenly
> >> seems to take a looooong time to do anything TTF related - strike fonts
> >> seem to run at normal speed.
> >
> > I don't know the answer to your question, but from what you're
> > describing I might guess the TTF font rendering uses some plugin
> > that is missing from your new VM. Check "Smalltalk listLoadedModules"
> > on your 3.7-7 VM (after doing something with your BookMorph) and
> > see if it shows some plugin that you have not included in your
> > 3.9-7 build.
> >
> > Dave
> >
> >
> >
>
>
> --
>  [][][] Tony Garnock-Jones     | Mob: +44 (0)7905 974 211
>    [][] LShift Ltd             | Tel: +44 (0)20 7729 7060
>  []  [] http://www.lshift.net/ | Email: [hidden email]

>  - 461 tallies, 477 msec.
>
> **Tree**
> 100.0% {477ms} BookMorph>>nextPage
>   100.0% {477ms} BookMorph>>goToPage:
>     100.0% {477ms} BookMorph>>goToPage:transitionSpec:
>       100.0% {477ms} BookMorph>>goToPageMorph:transitionSpec:
>         57.7% {275ms} PasteUpMorph>>displayWorld
>           |57.7% {275ms} PasteUpMorph>>privateOuterDisplayWorld
>           |  57.7% {275ms} WorldState>>displayWorld:submorphs:
>           |    57.7% {275ms} WorldState>>drawWorld:submorphs:invalidAreasOn:
>           |      57.7% {275ms} FormCanvas(Canvas)>>fullDrawMorph:
>           |        57.7% {275ms} FormCanvas(Canvas)>>fullDraw:
>           |          57.7% {275ms} BookMorph(Morph)>>fullDrawOn:
>           |            57.7% {275ms} BookMorph(Morph)>>drawSubmorphsOn:
>           |              57.7% {275ms} FormCanvas(Canvas)>>fullDrawMorph:
>           |                57.7% {275ms} FormCanvas(Canvas)>>fullDraw:
>           |                  57.7% {275ms} PasteUpMorph(Morph)>>fullDrawOn:
>           |                    52.3% {249ms} PasteUpMorph>>drawSubmorphsOn:
>           |                      |52.3% {249ms} FormCanvas(Canvas)>>fullDrawMorph:
> [52.3% {249ms} FormCanvas(Canvas)>>fullDraw:
> [  52.3% {249ms} TextMorph(Morph)>>fullDrawOn:
> [    52.3% {249ms} FormCanvas(Canvas)>>drawMorph:
> [      52.3% {249ms} FormCanvas(Canvas)>>draw:
> [        52.3% {249ms} TextMorph>>drawOn:
> [          30.6% {146ms} FormCanvas>>paragraph:bounds:color:
> [            |30.6% {146ms} MultiNewParagraph>>displayOn:using:at:
> [            |  30.6% {146ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
> [            |    27.1% {129ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
> [            |      19.3% {92ms} TTCFont>>glyphInfoOf:into:
> [            |        |11.3% {54ms} TTCFont>>ascentOf:
> [            |        |  |11.3% {54ms} TTCFont>>ascent
> [            |        |  |  6.7% {32ms} TTCFont>>pixelSize
> [            |        |  |    |6.7% {32ms} TextStyle class>>pointsToPixels:
> [            |        |  |    |  6.7% {32ms} TextStyle class>>pixelsPerInch
> [            |        |  |    |    6.7% {32ms} Dictionary>>at:ifAbsentPut:
> [            |        |  |    |      5.2% {25ms} Dictionary>>at:ifAbsent:
> [[3.0% {14ms} primitives
> [[2.2% {10ms} Dictionary(Set)>>findElementOrNil:
> [[  2.2% {10ms} Dictionary>>scanFor:
> [[    2.2% {10ms} ByteSymbol(String)>>hash
> [            |        |  |  4.6% {22ms} Float(Number)>>//
> [            |        |  |    3.0% {14ms} primitives
> [            |        |8.0% {38ms} TTCFont>>formOf:
> [            |        |  8.0% {38ms} TTCFont>>computeForm:
> [            |        |    6.3% {30ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [            |        |      6.3% {30ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [            |        |        6.3% {30ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
> [            |        |          5.0% {24ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
> [            |        |            3.0% {14ms} BalloonCanvas>>ensuredEngine
> [[3.0% {14ms} BalloonEngine class(Behavior)>>new
> [[  3.0% {14ms} BalloonEngine>>initialize
> [[    3.0% {14ms} BalloonEngine>>bitBlt:
> [            |      2.8% {13ms} primitives
> [          21.7% {104ms} TextMorph>>paragraph
> [            21.7% {104ms} MultiNewParagraph(NewParagraph)>>compose:style:from:in:
> [              21.7% {104ms} MultiNewParagraph(NewParagraph)>>composeAll
> [                21.7% {104ms} MultiNewParagraph(NewParagraph)>>composeLinesFrom:to:delta:into:priorLines:atY:
> [                  21.7% {104ms} TextComposer>>composeLinesFrom:to:del...ner:wantsColumnBreaks:
> [                    21.7% {104ms} TextComposer>>composeAllLines
> [                      21.7% {104ms} TextComposer>>composeOneLine
> [                        21.7% {104ms} TextComposer>>composeAllRectangles:
> [                          21.7% {104ms} TextComposer>>composeEachRectangleIn:
> [                            21.7% {104ms} CompositionScanner>>composeFrom:inRectan...leftSide:rightSide:
> [                              19.7% {94ms} CompositionScanner(CharacterScanner)>>scanCharactersFrom:to...stopConditions:kern:
> [                                19.7% {94ms} CompositionScanner(CharacterScanner)>>basicScanCharactersFr...stopConditions:kern:
> [[19.7% {94ms} TTCFont>>widthOf:
> [[  19.7% {94ms} TTCFont>>computeForm:
> [[    17.6% {84ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [[      |17.6% {84ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [[      |  17.6% {84ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
> [[      |    12.6% {60ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
> [[      |      |9.1% {43ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
> [[      |      |  |4.8% {23ms} BalloonEngine>>postFlushIfNeeded
> [[      |      |  |  |4.8% {23ms} BalloonEngine>>copyBits
> [[      |      |  |  |  4.8% {23ms} BalloonEngine>>copyLoopFaster
> [[      |      |  |4.3% {21ms} BalloonEngine>>registerFill:and:
> [[      |      |  |  4.3% {21ms} BalloonEngine>>registerFills:
> [[      |      |  |    2.4% {11ms} BalloonEngine>>registerFill:
> [[      |      |3.5% {17ms} BalloonCanvas>>ensuredEngine
> [[      |    5.0% {24ms} MatrixTransform2x3 class>>withScale:
> [[    2.2% {10ms} TTCFont>>pixelSize
> [[      2.2% {10ms} TextStyle class>>pointsToPixels:
> [[        2.2% {10ms} TextStyle class>>pixelsPerInch
> [[          2.2% {10ms} Dictionary>>at:ifAbsentPut:
> [[            2.2% {10ms} Dictionary>>at:ifAbsent:
> [[              2.2% {10ms} Dictionary(Set)>>findElementOrNil:
> [[                2.2% {10ms} Dictionary>>scanFor:
> [[                  2.2% {10ms} ByteSymbol(String)>>hash
> [[                    2.2% {10ms} ByteString class(Object)>>hash
>           |                    2.8% {13ms} FormCanvas(Canvas)>>drawMorph:
>           |                      2.8% {13ms} FormCanvas(Canvas)>>draw:
> [2.8% {13ms} PasteUpMorph>>drawOn:
> [  2.8% {13ms} PasteUpMorph(Morph)>>drawOn:
> [    2.8% {13ms} FormCanvas(Canvas)>>fillRectangle:fillStyle:borderStyle:
> [      2.8% {13ms} FormCanvas>>fillRectangle:fillStyle:
> [        2.8% {13ms} FormCanvas>>balloonFillRectangle:fillStyle:
> [          2.8% {13ms} BalloonCanvas>>fillRectangle:fillStyle:
> [            2.8% {13ms} BalloonCanvas>>drawRectangle:color:borderWidth:borderColor:
> [              2.8% {13ms} BalloonEngine>>drawRectangle:fill:bor...borderColor:transform:
> [                2.8% {13ms} BalloonEngine>>postFlushIfNeeded
> [                  2.8% {13ms} BalloonEngine>>copyBits
> [                    2.8% {13ms} BalloonEngine>>copyLoopFaster
>         38.8% {185ms} PasteUpMorph(Morph)>>updateCachedThumbnail
>           |38.8% {185ms} BookPageThumbnailMorph>>computeThumbnail
>           |  38.8% {185ms} PasteUpMorph(Morph)>>imageForm
>           |    38.8% {185ms} PasteUpMorph(Morph)>>imageFormForRectangle:
>           |      38.8% {185ms} PasteUpMorph(Morph)>>imageForm:forRectangle:
>           |        38.8% {185ms} FormCanvas(Canvas)>>fullDrawMorph:
>           |          38.8% {185ms} FormCanvas(Canvas)>>fullDraw:
>           |            38.8% {185ms} PasteUpMorph(Morph)>>fullDrawOn:
>           |              31.2% {149ms} PasteUpMorph>>drawSubmorphsOn:
>           |                |31.2% {149ms} FormCanvas(Canvas)>>fullDrawMorph:
>           |                |  31.2% {149ms} FormCanvas(Canvas)>>fullDraw:
>           |                |    31.2% {149ms} TextMorph(Morph)>>fullDrawOn:
>           |                |      31.2% {149ms} FormCanvas(Canvas)>>drawMorph:
> [31.2% {149ms} FormCanvas(Canvas)>>draw:
> [  31.2% {149ms} TextMorph>>drawOn:
> [    31.2% {149ms} FormCanvas>>paragraph:bounds:color:
> [      31.2% {149ms} MultiNewParagraph>>displayOn:using:at:
> [        31.2% {149ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
> [          28.2% {135ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
> [            19.1% {91ms} TTCFont>>glyphInfoOf:into:
> [              |17.6% {84ms} TTCFont>>ascentOf:
> [              |  17.6% {84ms} TTCFont>>ascent
> [              |    15.0% {72ms} TTCFont>>pixelSize
> [              |      |15.0% {72ms} TextStyle class>>pointsToPixels:
> [              |      |  15.0% {72ms} TextStyle class>>pixelsPerInch
> [              |      |    15.0% {72ms} Dictionary>>at:ifAbsentPut:
> [              |      |      13.2% {63ms} Dictionary>>at:ifAbsent:
> [              |      |        8.9% {42ms} primitives
> [              |      |        4.3% {21ms} Dictionary(Set)>>findElementOrNil:
> [              |      |          2.4% {11ms} Dictionary>>scanFor:
> [              |    2.6% {12ms} Float(Number)>>//
> [            4.8% {23ms} GrafPort(BitBlt)>>sourceForm:
> [            2.8% {13ms} primitives
>           |              7.6% {36ms} FormCanvas(Canvas)>>drawMorph:
>           |                7.6% {36ms} FormCanvas(Canvas)>>draw:
>           |                  7.6% {36ms} PasteUpMorph>>drawOn:
>           |                    7.6% {36ms} PasteUpMorph(Morph)>>drawOn:
>           |                      7.6% {36ms} FormCanvas(Canvas)>>fillRectangle:fillStyle:borderStyle:
> [7.6% {36ms} FormCanvas>>fillRectangle:fillStyle:
> [  7.6% {36ms} FormCanvas>>balloonFillRectangle:fillStyle:
> [    7.6% {36ms} BalloonCanvas>>fillRectangle:fillStyle:
> [      7.6% {36ms} BalloonCanvas>>drawRectangle:color:borderWidth:borderColor:
> [        7.6% {36ms} BalloonEngine>>drawRectangle:fill:bor...borderColor:transform:
> [          7.6% {36ms} BalloonEngine>>postFlushIfNeeded
> [            7.6% {36ms} BalloonEngine>>copyBits
> [              7.6% {36ms} BalloonEngine>>copyLoopFaster
>         3.5% {17ms} PasteUpMorph>>startSteppingSubmorphsOf:
>           3.5% {17ms} PasteUpMorph(Morph)>>arrangeToStartSteppingIn:
>
> **Leaves**
> 16.9% {81ms} BalloonEngine>>copyLoopFaster
> 13.2% {63ms} Dictionary>>at:ifAbsent:
> 6.5% {31ms} GrafPort(BitBlt)>>sourceForm:
> 5.6% {27ms} Float(Number)>>//
> 5.6% {27ms} Array(SequenceableCollection)>>do:
> 5.6% {27ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
> 5.0% {24ms} MatrixTransform2x3 class>>withScale:
> 3.7% {18ms} Dictionary(Set)>>findElementOrNil:
> 3.5% {17ms} Float(Number)>>floor
> 3.5% {17ms} Rectangle>>setOrigin:corner:
> 3.3% {16ms} Dictionary>>at:ifAbsentPut:
> 3.3% {16ms} ByteString class(Object)>>hash
> 3.3% {16ms} GrafPort(BitBlt)>>sourceOrigin:
> 3.0% {14ms} Point>>extent:
> 2.4% {11ms} BalloonEngine>>registerFill:
> 2.2% {10ms} ByteSymbol(String)>>hash
>
> **Memory**
> old +832,264 bytes
> young -549,516 bytes
> used +282,748 bytes
> free -282,748 bytes
>
> **GCs**
> full 0 totalling 0ms (0.0% uptime)
> incr 47 totalling 37ms (8.0% uptime), avg 1.0ms
> tenures 1 (avg 47 GCs/tenure)
> root table 0 overflows

>  - 50151 tallies, 50354 msec.
>
> **Tree**
> 100.0% {50354ms} BookMorph>>nextPage
>   100.0% {50354ms} BookMorph>>goToPage:
>     100.0% {50354ms} BookMorph>>goToPage:transitionSpec:
>       100.0% {50354ms} BookMorph>>goToPageMorph:transitionSpec:
>         61.2% {30817ms} PasteUpMorph(Morph)>>updateCachedThumbnail
>           |61.2% {30817ms} BookPageThumbnailMorph>>computeThumbnail
>           |  61.2% {30817ms} PasteUpMorph(Morph)>>imageForm
>           |    61.2% {30817ms} PasteUpMorph(Morph)>>imageFormForRectangle:
>           |      61.2% {30817ms} PasteUpMorph(Morph)>>imageForm:forRectangle:
>           |        61.2% {30817ms} FormCanvas(Canvas)>>fullDrawMorph:
>           |          61.2% {30817ms} FormCanvas(Canvas)>>fullDraw:
>           |            61.2% {30817ms} PasteUpMorph(Morph)>>fullDrawOn:
>           |              61.2% {30817ms} PasteUpMorph>>drawSubmorphsOn:
>           |                61.2% {30817ms} FormCanvas(Canvas)>>fullDrawMorph:
>           |                  61.2% {30817ms} FormCanvas(Canvas)>>fullDraw:
>           |                    61.2% {30817ms} TextMorph(Morph)>>fullDrawOn:
>           |                      61.1% {30766ms} FormCanvas(Canvas)>>drawMorph:
> [61.1% {30766ms} FormCanvas(Canvas)>>draw:
> [  61.1% {30766ms} TextMorph>>drawOn:
> [    61.1% {30766ms} FormCanvas>>paragraph:bounds:color:
> [      61.1% {30766ms} MultiNewParagraph>>displayOn:using:at:
> [        61.1% {30766ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
> [          29.2% {14703ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
> [            |27.5% {13847ms} TTCFont>>glyphInfoOf:into:
> [            |  20.0% {10071ms} TTCFont>>formOf:
> [            |    |19.2% {9668ms} TTCFont>>computeForm:
> [            |    |  17.8% {8963ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [            |    |    17.8% {8963ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [            |    |      17.8% {8963ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
> [            |    |        10.5% {5287ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
> [            |    |          |7.7% {3877ms} BalloonCanvas>>ensuredEngine
> [            |    |          |  |7.6% {3827ms} BalloonEngine class(Behavior)>>new
> [            |    |          |  |  7.6% {3827ms} BalloonEngine>>initialize
> [            |    |          |  |    7.0% {3525ms} BitBlt class>>toForm:
> [[6.7% {3374ms} primitives
> [            |    |          |2.6% {1309ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
> [            |    |        3.6% {1813ms} Form class>>extent:depth:
> [            |    |          |3.6% {1813ms} Form>>setExtent:depth:
> [            |    |          |  3.6% {1813ms} primitives
> [            |    |        2.8% {1410ms} Form(DisplayMedium)>>fillColor:
> [            |  6.6% {3323ms} TTCFont>>ascentOf:
> [            |    6.6% {3323ms} TTCFont>>ascent
> [            |      4.4% {2216ms} TTCFont>>pixelSize
> [            |        |4.4% {2216ms} TextStyle class>>pointsToPixels:
> [            |        |  4.4% {2216ms} TextStyle class>>pixelsPerInch
> [            |        |    4.1% {2065ms} Dictionary>>at:ifAbsentPut:
> [            |        |      4.1% {2065ms} Dictionary>>at:ifAbsent:
> [            |        |        3.0% {1511ms} Dictionary(Set)>>findElementOrNil:
> [            |        |          2.7% {1360ms} Dictionary>>scanFor:
> [            |      2.2% {1108ms} Float(Number)>>//
> [          28.0% {14099ms} MultiDisplayScanner(MultiCharacterScanner)>>scanCharactersFrom...opConditions:kern:
> [            |28.0% {14099ms} MultiDisplayScanner(MultiCharacterScanner)>>basicScanCharacter...opConditions:kern:
> [            |  28.0% {14099ms} TTCFont>>widthOf:
> [            |    26.4% {13293ms} TTCFont>>computeForm:
> [            |      25.8% {12991ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [            |        25.8% {12991ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [            |          25.8% {12991ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
> [            |            19.8% {9970ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
> [            |              |14.9% {7503ms} BalloonCanvas>>ensuredEngine
> [            |              |  |14.2% {7150ms} BalloonEngine class(Behavior)>>new
> [            |              |  |  14.2% {7150ms} BalloonEngine>>initialize
> [            |              |  |    12.2% {6143ms} BitBlt class>>toForm:
> [[12.2% {6143ms} primitives
> [            |              |5.0% {2518ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
> [            |              |  3.1% {1561ms} BalloonEngine>>registerFill:and:
> [            |              |    3.1% {1561ms} BalloonEngine>>registerFills:
> [            |              |      2.5% {1259ms} BalloonEngine>>registerFill:
> [            |            2.8% {1410ms} Form(DisplayMedium)>>fillColor:
> [          3.1% {1561ms} MultiDisplayScanner>>endOfRun
> [            3.0% {1511ms} MultiDisplayScanner>>setStopConditions
> [              3.0% {1511ms} MultiDisplayScanner>>setFont
> [                3.0% {1511ms} MultiDisplayScanner(MultiCharacterScanner)>>setFont
> [                  3.0% {1511ms} TTCFont>>widthOf:
> [                    2.5% {1259ms} TTCFont>>computeForm:
> [                      2.5% {1259ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [                        2.5% {1259ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [                          2.5% {1259ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
>         38.2% {19235ms} PasteUpMorph>>displayWorld
>           38.2% {19235ms} PasteUpMorph>>privateOuterDisplayWorld
>             38.2% {19235ms} WorldState>>displayWorld:submorphs:
>               38.2% {19235ms} WorldState>>drawWorld:submorphs:invalidAreasOn:
>                 38.2% {19235ms} FormCanvas(Canvas)>>fullDrawMorph:
>                   38.2% {19235ms} FormCanvas(Canvas)>>fullDraw:
>                     38.2% {19235ms} BookMorph(Morph)>>fullDrawOn:
>                       38.2% {19235ms} BookMorph(Morph)>>drawSubmorphsOn:
>                         38.2% {19235ms} FormCanvas(Canvas)>>fullDrawMorph:
>                           38.2% {19235ms} FormCanvas(Canvas)>>fullDraw:
>                             38.2% {19235ms} PasteUpMorph(Morph)>>fullDrawOn:
>                               37.4% {18832ms} PasteUpMorph>>drawSubmorphsOn:
>                                 37.4% {18832ms} FormCanvas(Canvas)>>fullDrawMorph:
> [37.4% {18832ms} FormCanvas(Canvas)>>fullDraw:
> [  37.4% {18832ms} TextMorph(Morph)>>fullDrawOn:
> [    37.3% {18782ms} FormCanvas(Canvas)>>drawMorph:
> [      37.3% {18782ms} FormCanvas(Canvas)>>draw:
> [        37.3% {18782ms} TextMorph>>drawOn:
> [          30.7% {15459ms} FormCanvas>>paragraph:bounds:color:
> [            |30.7% {15459ms} MultiNewParagraph>>displayOn:using:at:
> [            |  30.7% {15459ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
> [            |    16.1% {8107ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
> [            |      |11.9% {5992ms} TTCFont>>glyphInfoOf:into:
> [            |      |  6.9% {3474ms} TTCFont>>ascentOf:
> [            |      |    |6.9% {3474ms} TTCFont>>ascent
> [            |      |    |  4.7% {2367ms} TTCFont>>pixelSize
> [            |      |    |    4.4% {2216ms} TextStyle class>>pointsToPixels:
> [            |      |    |      4.4% {2216ms} TextStyle class>>pixelsPerInch
> [            |      |    |        4.2% {2115ms} Dictionary>>at:ifAbsentPut:
> [            |      |    |          3.6% {1813ms} Dictionary>>at:ifAbsent:
> [            |      |  5.0% {2518ms} TTCFont>>formOf:
> [            |      |    4.7% {2367ms} TTCFont>>computeForm:
> [            |      |      3.8% {1913ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [            |      |        3.8% {1913ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [            |      |          3.8% {1913ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
> [            |      |            2.1% {1057ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
> [            |    11.3% {5690ms} MultiDisplayScanner(MultiCharacterScanner)>>scanCharactersFrom...opConditions:kern:
> [            |      11.3% {5690ms} MultiDisplayScanner(MultiCharacterScanner)>>basicScanCharacter...opConditions:kern:
> [            |        11.2% {5640ms} TTCFont>>widthOf:
> [            |          11.2% {5640ms} TTCFont>>computeForm:
> [            |            9.8% {4935ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [            |              9.8% {4935ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [            |                9.8% {4935ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
> [            |                  5.8% {2921ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
> [            |                    3.4% {1712ms} BalloonCanvas>>ensuredEngine
> [            |                    2.4% {1208ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
> [          6.6% {3323ms} TextMorph>>paragraph
> [            6.6% {3323ms} MultiNewParagraph(NewParagraph)>>compose:style:from:in:
> [              6.6% {3323ms} MultiNewParagraph(NewParagraph)>>composeAll
> [                6.6% {3323ms} MultiNewParagraph(NewParagraph)>>composeLinesFrom:to:delta:into:priorLines:atY:
> [                  6.6% {3323ms} TextComposer>>composeLinesFrom:to:del...ner:wantsColumnBreaks:
> [                    6.6% {3323ms} TextComposer>>composeAllLines
> [                      6.6% {3323ms} TextComposer>>composeOneLine
> [                        6.6% {3323ms} TextComposer>>composeAllRectangles:
> [                          6.6% {3323ms} TextComposer>>composeEachRectangleIn:
> [                            6.4% {3223ms} CompositionScanner>>composeFrom:inRectan...leftSide:rightSide:
> [                              6.1% {3072ms} CompositionScanner(CharacterScanner)>>scanCharactersFrom:to...stopConditions:kern:
> [                                6.1% {3072ms} CompositionScanner(CharacterScanner)>>basicScanCharactersFr...stopConditions:kern:
> [[6.1% {3072ms} TTCFont>>widthOf:
> [[  5.8% {2921ms} TTCFont>>computeForm:
> [[    4.6% {2316ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
> [[      4.6% {2316ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
> [[        4.6% {2316ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
> [[          2.9% {1460ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
>
> **Leaves**
> 20.3% {10222ms} BitBlt class>>toForm:
> 6.1% {3072ms} Form>>setExtent:depth:
> 5.3% {2669ms} Rectangle>>setOrigin:corner:
> 3.6% {1813ms} Dictionary>>at:ifAbsent:
> 3.3% {1662ms} Point>>+
> 3.0% {1511ms} Dictionary>>scanFor:
> 3.0% {1511ms} Float(Number)>>//
> 2.8% {1410ms} Point>>*
> 2.5% {1259ms} Association>>key:value:
> 2.5% {1259ms} Form(DisplayMedium)>>fillColor:
> 2.2% {1108ms} Color>>pixelWordFor:filledWith:
> 2.2% {1108ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
> 2.1% {1057ms} BalloonEngine>>copyLoopFaster
>
> **Memory**
> old +1,565,496 bytes
> young -1,278,376 bytes
> used +287,120 bytes
> free +1,279,316 bytes
>
> **GCs**
> full 1 totalling 200ms (0.0% uptime), avg 200.0ms
> incr 518 totalling 1,117ms (2.0% uptime), avg 2.0ms
> tenures 2 (avg 259 GCs/tenure)
> root table 0 overflows

>


Reply | Threaded
Open this post in threaded view
|

Re: Poor TTF font performance on Linux with newer VM

Tony Garnock-Jones-2
David T. Lewis wrote:
> Are you saying that your 3.9 VM does *not* have the FFI plugin? If
> that is the case, try adding it to the build in case FFI is being
> used for the TTF fonts in some way.

No, the 3.9 VM *does* have an internal SqueakFFIPrims, whereas the 3.7
VM does *not* have an internal SqueakFFIPrims.

Conversely, the 3.7 VM has an internal UnixOSProcessPlugin, where the
3.9 VM does not (it is external and present in the lib directory, though
not loaded).

Summary of changes (excluding version differences):

Present only in 3.7-7: AioPlugin, UnixOSProcessPlugin
Present only in 3.9-4, 3.9-7, SVN trunk: CroquetPlugin, FloatMathPlugin
The lists are otherwise the same.

Tony
--
 [][][] Tony Garnock-Jones     | Mob: +44 (0)7905 974 211
   [][] LShift Ltd             | Tel: +44 (0)20 7729 7060
 []  [] http://www.lshift.net/ | Email: [hidden email]

Reply | Threaded
Open this post in threaded view
|

Re: Poor TTF font performance on Linux with newer VM

Tony Garnock-Jones-2
In reply to this post by Göran Krampe
I've just checked against 3.9-4 (built from source tarball from
squeakvm.org), and it's still hideously slow. So it's down to something
that changed between 3.7-7 and 3.9-4. Or perhaps CroquetPlugin or
FloatMathPlugin. Or AioPlugin or UnixOSProcess :-)

Tony.

[hidden email] wrote:

> Hi!
>
> Tony Garnock-Jones <[hidden email]> wrote:
>> Thanks for that - I had suspected it might be a plugin. I've followed
>> your suggestion, and the plugin list is almost identical except for
>> OSProcess and FFI plugins.
>>
>> I've just run "MessageTally spyOn: [3 timesRepeat: [self nextPage]]" on
>> my BookMorph. The two results are dramatically different: on the 3.7 VM,
>> 477ms for the whole thing; on the 3.9 VM, 50354ms for the whole thing! A
>> factor of 100x slower.
>
> Just wanted to mention that this might indeed be the issue I have been
> experiencing with the new VM in my IRCe image - I thought it had to do
> with Socket communication, but hey, it might as well be this in fact.
>
> regards, Göran
>
>


Reply | Threaded
Open this post in threaded view
|

Re: Poor TTF font performance on Linux with newer VM

Tony Garnock-Jones-2
I've just tried a similar setup in a 3.9b-7032 image with 3.7-7 and
3.9-svn, and I get

3.7-7 - 107 tallies, 120 msec.
3.9-svn just after Smalltalk garbageCollect - 990 tallies, 1005 msec.
3.9-svn otherwise - 1323 tallies, 1343 msec.

So either the glyph caching isn't aggressive enough for this use case (I
made sure to use a real-world text example, rather than homogenous
repeats of the same string), or it's some other problem.

Traces attached.

Regards,
  Tony

Tony Garnock-Jones wrote:

> Bert Freudenberg wrote:
>> Isn't that still the issue that TTF glyphs are not cached long enough
>> anymore because of a fix to the garbage collector's weak ref handling?
>>
>> Is there a fix in the image by now?
>
> Wow. That could be interesting to test. I'll try saving and loading the
> project with the BookMorph into a 3.9 image; failing that, I'll try
> building a mock couple of pages similar to those I have in my 3.8 image.
>
> I'll report back.
>
> Thanks,
>   Tony
>
>

 - 107 tallies, 120 msec.

**Tree**
99.1% {119ms} BookMorph>>nextPage
  99.1% {119ms} BookMorph>>goToPage:
    99.1% {119ms} BookMorph>>goToPage:transitionSpec:
      99.1% {119ms} BookMorph>>goToPageMorph:transitionSpec:
        57.0% {68ms} PasteUpMorph(Morph)>>fullReleaseCachedState
          |57.0% {68ms} TextMorph>>releaseCachedState
          |  57.0% {68ms} TextMorph>>paragraph
          |    57.0% {68ms} MultiNewParagraph(NewParagraph)>>compose:style:from:in:
          |      57.0% {68ms} MultiNewParagraph(NewParagraph)>>composeAll
          |        57.0% {68ms} MultiNewParagraph(NewParagraph)>>composeLinesFrom:to:delta:into:priorLines:atY:
          |          57.0% {68ms} TextComposer>>composeLinesFrom:to:del...ner:wantsColumnBreaks:
          |            57.0% {68ms} TextComposer>>composeAllLines
          |              50.5% {61ms} TextComposer>>composeOneLine
          |                |43.9% {53ms} TextComposer>>composeAllRectangles:
          |                |  |43.9% {53ms} TextComposer>>composeEachRectangleIn:
          |                |  |  29.0% {35ms} CompositionScanner>>composeFrom:inRectan...leftSide:rightSide:
          |                |  |    |22.4% {27ms} CompositionScanner>>setStopConditions
          |                |  |    |  |22.4% {27ms} CompositionScanner>>setFont
          |                |  |    |  |  22.4% {27ms} CompositionScanner(CharacterScanner)>>setFont
          |                |  |    |  |    22.4% {27ms} TextFontReference>>emphasizeScanner:
          |                |  |    |  |      22.4% {27ms} CompositionScanner>>setActualFont:
          |                |  |    |  |        21.5% {26ms} TTCFont>>descent
          |                |  |    |  |          21.5% {26ms} TTCFont>>pixelSize
          |                |  |    |  |            21.5% {26ms} TextStyle class>>pointsToPixels:
          |                |  |    |  |              21.5% {26ms} TextStyle class>>pixelsPerInch
          |                |  |    |  |                21.5% {26ms} Dictionary>>at:ifAbsentPut:
          |                |  |    |  |                  21.5% {26ms} Dictionary>>at:ifAbsent:
          |                |  |    |  |                    21.5% {26ms} Dictionary(Set)>>findElementOrNil:
          |                |  |    |  |                      21.5% {26ms} Dictionary>>scanFor:
          |                |  |    |  |                        21.5% {26ms} ByteSymbol(String)>>hash
          |                |  |    |  |                          20.6% {25ms} primitives
          |                |  |    |6.5% {8ms} CompositionScanner(CharacterScanner)>>handleIndentation
          |                |  |    |  6.5% {8ms} SmallInteger(Integer)>>timesRepeat:
          |                |  |  15.0% {18ms} SmallInteger(Magnitude)>>max:
          |                |6.5% {8ms} Rectangle>>rectanglesAt:height:
          |                |  6.5% {8ms} Point>>corner:
          |                |    6.5% {8ms} Rectangle class>>origin:corner:
          |                |      6.5% {8ms} Rectangle>>setOrigin:corner:
          |              6.5% {8ms} Rectangle>>bottom
        42.1% {51ms} PasteUpMorph>>displayWorld
          42.1% {51ms} PasteUpMorph>>privateOuterDisplayWorld
            42.1% {51ms} WorldState>>displayWorld:submorphs:
              42.1% {51ms} WorldState>>drawWorld:submorphs:invalidAreasOn:
                42.1% {51ms} FormCanvas(Canvas)>>fullDrawMorph:
                  42.1% {51ms} FormCanvas(Canvas)>>fullDraw:
                    42.1% {51ms} BookMorph(Morph)>>fullDrawOn:
                      42.1% {51ms} BookMorph(Morph)>>drawSubmorphsOn:
                        42.1% {51ms} FormCanvas(Canvas)>>fullDrawMorph:
                          42.1% {51ms} FormCanvas(Canvas)>>fullDraw:
                            42.1% {51ms} PasteUpMorph(Morph)>>fullDrawOn:
                              42.1% {51ms} PasteUpMorph>>drawSubmorphsOn:
                                42.1% {51ms} FormCanvas(Canvas)>>fullDrawMorph:
                                  42.1% {51ms} FormCanvas(Canvas)>>fullDraw:
                                    42.1% {51ms} TextMorph(Morph)>>fullDrawOn:
                                      42.1% {51ms} FormCanvas(Canvas)>>drawMorph:
                                        42.1% {51ms} FormCanvas(Canvas)>>draw:
                                          42.1% {51ms} TextMorph>>drawOn:
                                            42.1% {51ms} FormCanvas>>paragraph:bounds:color:
                                              42.1% {51ms} MultiNewParagraph>>displayOn:using:at:
                                                42.1% {51ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
                                                  29.0% {35ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
                                                    |15.0% {18ms} primitives
                                                    |14.0% {17ms} GrafPort>>copyBits
                                                  13.1% {16ms} MultiDisplayScanner>>setStopConditions
                                                    13.1% {16ms} MultiDisplayScanner>>setFont
                                                      13.1% {16ms} TTCFont>>installOn:foregroundColor:backgroundColor:
                                                        13.1% {16ms} GrafPort>>installTTCFont:foregroundColor:backgroundColor:
                                                          13.1% {16ms} GrafPort(BitBlt)>>installTTCFont:foregroundColor:backgroundColor:
                                                            13.1% {16ms} TTCFont>>height
                                                              13.1% {16ms} TTCFont>>pixelSize
                                                                13.1% {16ms} TextStyle class>>pointsToPixels:
                                                                  13.1% {16ms} TextStyle class>>pixelsPerInch
                                                                    13.1% {16ms} Dictionary>>at:ifAbsentPut:

**Leaves**
20.6% {25ms} ByteSymbol(String)>>hash
15.9% {19ms} SmallInteger(Magnitude)>>max:
15.0% {18ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
14.0% {17ms} GrafPort>>copyBits
13.1% {16ms} Dictionary>>at:ifAbsentPut:
6.5% {8ms} Rectangle>>bottom
6.5% {8ms} SmallInteger(Integer)>>timesRepeat:
6.5% {8ms} Rectangle>>setOrigin:corner:

**Memory**
        old +80,608 bytes
        young -226,056 bytes
        used -145,448 bytes
        free +145,448 bytes

**GCs**
        full 0 totalling 0ms (0.0% uptime)
        incr 10 totalling 0ms (0.0% uptime), avg 0.0ms
        tenures 1 (avg 10 GCs/tenure)
        root table 0 overflows

 - 1323 tallies, 1343 msec.

**Tree**
100.0% {1343ms} BookMorph>>nextPage
  100.0% {1343ms} BookMorph>>goToPage:
    100.0% {1343ms} BookMorph>>goToPage:transitionSpec:
      100.0% {1343ms} BookMorph>>goToPageMorph:transitionSpec:
        81.1% {1089ms} PasteUpMorph(Morph)>>fullReleaseCachedState
          |81.1% {1089ms} TextMorph>>releaseCachedState
          |  81.1% {1089ms} TextMorph>>paragraph
          |    81.1% {1089ms} MultiNewParagraph(NewParagraph)>>compose:style:from:in:
          |      81.1% {1089ms} MultiNewParagraph(NewParagraph)>>composeAll
          |        81.1% {1089ms} MultiNewParagraph(NewParagraph)>>composeLinesFrom:to:delta:into:priorLines:atY:
          |          81.1% {1089ms} TextComposer>>composeLinesFrom:to:del...ner:wantsColumnBreaks:
          |            81.0% {1088ms} TextComposer>>composeAllLines
          |              81.0% {1088ms} TextComposer>>composeOneLine
          |                80.2% {1077ms} TextComposer>>composeAllRectangles:
          |                  80.0% {1074ms} TextComposer>>composeEachRectangleIn:
          |                    79.4% {1066ms} CompositionScanner>>composeFrom:inRectan...leftSide:rightSide:
          |                      73.7% {990ms} CompositionScanner(CharacterScanner)>>scanCharactersFrom:to...stopConditions:kern:
          |                        |73.5% {987ms} CompositionScanner(CharacterScanner)>>basicScanCharactersFr...stopConditions:kern:
          |                        |  72.1% {968ms} TTCFont>>widthOf:
          |                        |    67.2% {902ms} TTCFont>>computeForm:
          |                        |      |63.0% {846ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
          |                        |      |  |63.0% {846ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
          |                        |      |  |  62.7% {842ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
          |                        |      |  |    44.8% {602ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
          |                        |      |  |      |27.2% {365ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
          |                        |      |  |      |  |18.9% {254ms} BalloonEngine>>postFlushIfNeeded
          |                        |      |  |      |  |  |17.0% {228ms} BalloonEngine>>copyBits
          |                        |      |  |      |  |  |  16.5% {222ms} BalloonEngine>>copyLoopFaster
          |                        |      |  |      |  |  |    16.4% {220ms} primitives
          |                        |      |  |      |  |6.1% {82ms} BalloonEngine>>registerFill:and:
          |                        |      |  |      |  |  5.4% {73ms} BalloonEngine>>registerFills:
          |                        |      |  |      |  |    2.8% {38ms} BalloonEngine>>registerFill:
          |                        |      |  |      |  |      2.4% {32ms} Color>>scaledPixelValue32
          |                        |      |  |      |  |        2.2% {30ms} Color>>pixelWordForDepth:
          |                        |      |  |      |17.4% {234ms} BalloonCanvas>>ensuredEngine
          |                        |      |  |      |  9.5% {128ms} BalloonEngine class(Behavior)>>new
          |                        |      |  |      |    |9.5% {128ms} BalloonEngine>>initialize
          |                        |      |  |      |    |  5.2% {70ms} BalloonEngine>>bitBlt:
          |                        |      |  |      |  5.0% {67ms} BalloonEngine>>bitBlt:
          |                        |      |  |    5.7% {77ms} Form(DisplayMedium)>>fillColor:
          |                        |      |  |      |4.3% {58ms} Form(DisplayMedium)>>fill:fillColor:
          |                        |      |  |      |  3.9% {52ms} Form>>fill:rule:fillColor:
          |                        |      |  |      |    2.0% {27ms} BitBlt class>>toForm:
          |                        |      |  |    4.1% {55ms} BalloonCanvas class(FormCanvas class)>>on:
          |                        |      |  |      3.3% {44ms} BalloonCanvas(FormCanvas)>>setForm:
          |                        |      |  |        2.1% {28ms} GrafPort class(BitBlt class)>>toForm:
          |                        |      |2.1% {28ms} TTCFont>>pixelSize
          |                        |      |  2.0% {27ms} TextStyle class>>pointsToPixels:
          |                        |      |    2.0% {27ms} TextStyle class>>pixelsPerInch
          |                        |    2.1% {28ms} Character>>charCode
          |                      3.6% {48ms} CompositionScanner>>setStopConditions
          |                        3.6% {48ms} CompositionScanner>>setFont
          |                          3.4% {46ms} CompositionScanner(CharacterScanner)>>setFont
        18.3% {246ms} PasteUpMorph>>displayWorld
          18.3% {246ms} PasteUpMorph>>privateOuterDisplayWorld
            18.3% {246ms} WorldState>>displayWorld:submorphs:
              18.2% {244ms} WorldState>>drawWorld:submorphs:invalidAreasOn:
                18.2% {244ms} FormCanvas(Canvas)>>fullDrawMorph:
                  18.2% {244ms} FormCanvas(Canvas)>>fullDraw:
                    18.2% {244ms} BookMorph(Morph)>>fullDrawOn:
                      18.2% {244ms} BookMorph(Morph)>>drawSubmorphsOn:
                        18.2% {244ms} FormCanvas(Canvas)>>fullDrawMorph:
                          18.2% {244ms} FormCanvas(Canvas)>>fullDraw:
                            18.2% {244ms} PasteUpMorph(Morph)>>fullDrawOn:
                              17.5% {235ms} PasteUpMorph>>drawSubmorphsOn:
                                17.0% {228ms} FormCanvas(Canvas)>>fullDrawMorph:
                                  17.0% {228ms} FormCanvas(Canvas)>>fullDraw:
                                    17.0% {228ms} TextMorph(Morph)>>fullDrawOn:
                                      17.0% {228ms} FormCanvas(Canvas)>>drawMorph:
                                        17.0% {228ms} FormCanvas(Canvas)>>draw:
                                          17.0% {228ms} TextMorph>>drawOn:
                                            17.0% {228ms} FormCanvas>>paragraph:bounds:color:
                                              17.0% {228ms} MultiNewParagraph>>displayOn:using:at:
                                                17.0% {228ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
                                                  9.0% {121ms} MultiDisplayScanner(MultiCharacterScanner)>>scanCharactersFrom...opConditions:kern:
                                                    |9.0% {121ms} MultiDisplayScanner(MultiCharacterScanner)>>basicScanCharacter...opConditions:kern:
                                                    |  9.0% {121ms} TTCFont>>widthOf:
                                                    |    8.7% {117ms} TTCFont>>computeForm:
                                                    |      7.8% {105ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
                                                    |        7.8% {105ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
                                                    |          7.8% {105ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
                                                    |            5.6% {75ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
                                                    |              2.9% {39ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
                                                    |              2.6% {35ms} BalloonCanvas>>ensuredEngine
                                                  6.8% {91ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
                                                    4.9% {66ms} TTCFont>>glyphInfoOf:into:
                                                      4.5% {60ms} TTCFont>>formOf:
                                                        3.3% {44ms} TTCFont>>computeForm:
                                                          3.1% {42ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
                                                            3.1% {42ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
                                                              3.1% {42ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
                                                                2.3% {31ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:

**Leaves**
19.5% {262ms} BalloonEngine>>copyLoopFaster
3.6% {48ms} Character>>charCode
2.9% {39ms} Rectangle>>setOrigin:corner:
2.1% {28ms} Rectangle>>top
2.0% {27ms} LargePositiveInteger class(Behavior)>>new:

**Memory**
        old +150,016 bytes
        young +80,404 bytes
        used +230,420 bytes
        free -230,420 bytes

**GCs**
        full 0 totalling 0ms (0.0% uptime)
        incr 174 totalling 62ms (5.0% uptime), avg 0.0ms
        tenures 2 (avg 87 GCs/tenure)
        root table 0 overflows

 - 990 tallies, 1005 msec.

**Tree**
100.0% {1005ms} BookMorph>>nextPage
  100.0% {1005ms} BookMorph>>goToPage:
    100.0% {1005ms} BookMorph>>goToPage:transitionSpec:
      99.9% {1004ms} BookMorph>>goToPageMorph:transitionSpec:
        74.7% {751ms} PasteUpMorph(Morph)>>fullReleaseCachedState
          |74.7% {751ms} TextMorph>>releaseCachedState
          |  74.7% {751ms} TextMorph>>paragraph
          |    74.7% {751ms} MultiNewParagraph(NewParagraph)>>compose:style:from:in:
          |      74.7% {751ms} MultiNewParagraph(NewParagraph)>>composeAll
          |        74.7% {751ms} MultiNewParagraph(NewParagraph)>>composeLinesFrom:to:delta:into:priorLines:atY:
          |          74.7% {751ms} TextComposer>>composeLinesFrom:to:del...ner:wantsColumnBreaks:
          |            73.9% {743ms} TextComposer>>composeAllLines
          |              73.9% {743ms} TextComposer>>composeOneLine
          |                73.5% {739ms} TextComposer>>composeAllRectangles:
          |                  73.3% {737ms} TextComposer>>composeEachRectangleIn:
          |                    73.0% {734ms} CompositionScanner>>composeFrom:inRectan...leftSide:rightSide:
          |                      67.3% {676ms} CompositionScanner(CharacterScanner)>>scanCharactersFrom:to...stopConditions:kern:
          |                        |67.1% {674ms} CompositionScanner(CharacterScanner)>>basicScanCharactersFr...stopConditions:kern:
          |                        |  65.9% {662ms} TTCFont>>widthOf:
          |                        |    61.2% {615ms} TTCFont>>computeForm:
          |                        |      57.1% {574ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
          |                        |        |57.0% {573ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
          |                        |        |  56.7% {570ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
          |                        |        |    40.2% {404ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
          |                        |        |      |24.4% {245ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
          |                        |        |      |  |17.4% {175ms} BalloonEngine>>postFlushIfNeeded
          |                        |        |      |  |  |16.0% {161ms} BalloonEngine>>copyBits
          |                        |        |      |  |  |  15.3% {154ms} BalloonEngine>>copyLoopFaster
          |                        |        |      |  |  |    14.0% {141ms} primitives
          |                        |        |      |  |5.1% {51ms} BalloonEngine>>registerFill:and:
          |                        |        |      |  |  4.5% {45ms} BalloonEngine>>registerFills:
          |                        |        |      |  |    2.4% {24ms} BalloonEngine>>registerFill:
          |                        |        |      |  |      2.2% {22ms} Color>>scaledPixelValue32
          |                        |        |      |15.7% {158ms} BalloonCanvas>>ensuredEngine
          |                        |        |      |  8.7% {87ms} BalloonEngine class(Behavior)>>new
          |                        |        |      |    |8.5% {85ms} BalloonEngine>>initialize
          |                        |        |      |    |  5.5% {55ms} BalloonEngine>>bitBlt:
          |                        |        |      |  4.6% {46ms} BalloonEngine>>bitBlt:
          |                        |        |    5.6% {56ms} Form(DisplayMedium)>>fillColor:
          |                        |        |      |4.8% {48ms} Form(DisplayMedium)>>fill:fillColor:
          |                        |        |      |  4.4% {44ms} Form>>fill:rule:fillColor:
          |                        |        |      |    2.4% {24ms} BitBlt>>copy:from:in:fillColor:rule:
          |                        |        |    4.5% {45ms} BalloonCanvas class(FormCanvas class)>>on:
          |                        |        |      4.0% {40ms} BalloonCanvas(FormCanvas)>>setForm:
          |                        |      2.8% {28ms} TTCFont>>pixelSize
          |                        |        2.2% {22ms} TextStyle class>>pointsToPixels:
          |                      4.2% {42ms} CompositionScanner>>setStopConditions
          |                        4.2% {42ms} CompositionScanner>>setFont
          |                          4.0% {40ms} CompositionScanner(CharacterScanner)>>setFont
          |                            2.6% {26ms} TTCFont>>widthOf:
          |                              2.4% {24ms} TTCFont>>computeForm:
          |                                2.3% {23ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
          |                                  2.3% {23ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
          |                                    2.3% {23ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
        24.2% {243ms} PasteUpMorph>>displayWorld
          24.2% {243ms} PasteUpMorph>>privateOuterDisplayWorld
            24.2% {243ms} WorldState>>displayWorld:submorphs:
              24.0% {241ms} WorldState>>drawWorld:submorphs:invalidAreasOn:
                24.0% {241ms} FormCanvas(Canvas)>>fullDrawMorph:
                  24.0% {241ms} FormCanvas(Canvas)>>fullDraw:
                    24.0% {241ms} BookMorph(Morph)>>fullDrawOn:
                      23.9% {240ms} BookMorph(Morph)>>drawSubmorphsOn:
                        23.9% {240ms} FormCanvas(Canvas)>>fullDrawMorph:
                          23.9% {240ms} FormCanvas(Canvas)>>fullDraw:
                            23.9% {240ms} PasteUpMorph(Morph)>>fullDrawOn:
                              22.4% {225ms} PasteUpMorph>>drawSubmorphsOn:
                                22.4% {225ms} FormCanvas(Canvas)>>fullDrawMorph:
                                  22.4% {225ms} FormCanvas(Canvas)>>fullDraw:
                                    22.4% {225ms} TextMorph(Morph)>>fullDrawOn:
                                      22.4% {225ms} FormCanvas(Canvas)>>drawMorph:
                                        22.4% {225ms} FormCanvas(Canvas)>>draw:
                                          22.4% {225ms} TextMorph>>drawOn:
                                            22.4% {225ms} FormCanvas>>paragraph:bounds:color:
                                              22.4% {225ms} MultiNewParagraph>>displayOn:using:at:
                                                22.1% {222ms} MultiDisplayScanner>>displayLine:offset:leftInRun:
                                                  13.5% {136ms} MultiDisplayScanner(MultiCharacterScanner)>>scanCharactersFrom...opConditions:kern:
                                                    |13.5% {136ms} MultiDisplayScanner(MultiCharacterScanner)>>basicScanCharacter...opConditions:kern:
                                                    |  13.4% {135ms} TTCFont>>widthOf:
                                                    |    13.0% {131ms} TTCFont>>computeForm:
                                                    |      12.3% {124ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
                                                    |        12.2% {123ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
                                                    |          12.2% {123ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
                                                    |            9.5% {95ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:
                                                    |              4.7% {47ms} BalloonEngine>>drawGeneralBezierShape...borderColor:transform:
                                                    |                |2.9% {29ms} BalloonEngine>>postFlushIfNeeded
                                                    |                |  2.2% {22ms} BalloonEngine>>copyBits
                                                    |                |    2.2% {22ms} BalloonEngine>>copyLoopFaster
                                                    |              4.6% {46ms} BalloonCanvas>>ensuredEngine
                                                    |                2.4% {24ms} BalloonEngine class(Behavior)>>new
                                                    |                  2.3% {23ms} BalloonEngine>>initialize
                                                  8.2% {82ms} TTCFont>>displayString:on:from:to:at:kern:baselineY:
                                                    5.2% {52ms} TTCFont>>glyphInfoOf:into:
                                                      4.9% {49ms} TTCFont>>formOf:
                                                        3.7% {37ms} TTCFont>>computeForm:
                                                          3.5% {35ms} TTGlyph>>asFormWithScale:ascender:...er:fgColor:bgColor:depth:
                                                            3.5% {35ms} TTGlyph>>asFormWithScale:ascender:...Color:depth:replaceColor:
                                                              3.5% {35ms} TTGlyph>>asFormWithScale:ascender:...:lingGlyphWidth:emphasis:
                                                                2.3% {23ms} BalloonCanvas>>drawGeneralBezierShape...rderWidth:borderColor:

**Leaves**
18.1% {182ms} BalloonEngine>>copyLoopFaster
2.9% {29ms} Character>>charCode
2.6% {26ms} Rectangle>>setOrigin:corner:
2.4% {24ms} BalloonEdgeData class(Behavior)>>new
2.4% {24ms} LargePositiveInteger class(Behavior)>>new:

**Memory**
        old +109,396 bytes
        young -11,092 bytes
        used +98,304 bytes
        free -98,304 bytes

**GCs**
        full 0 totalling 0ms (0.0% uptime)
        incr 129 totalling 36ms (4.0% uptime), avg 0.0ms
        tenures 1 (avg 129 GCs/tenure)
        root table 0 overflows