Poor TTF font performance on Linux with newer VM
Tony Garnock-Jones
tonyg at lshift.net
Thu May 18 11:59:21 UTC 2006
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
>
>
-------------- next part --------------
- 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
-------------- next part --------------
- 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
-------------- next part --------------
- 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
More information about the Vm-dev
mailing list