[Pharo-users] Alignment visualization performance

Hernán Morales Durand hernan.morales at gmail.com
Fri Feb 21 00:40:04 EST 2020


Hello guys.

I want to visualize DNA sequence alignments in Pharo 8. For this task most
bioinformatics applications set a background color for each letter. But in
Pharo the Inspector is too slow to open even for just one small sequence of
1Kb. Consider now there are about 37k sequences of COVID-19 and each genome
contains about 30k of letters, so visualizing and scrolling these should be
fast (as for zooming).

But have a look at this script which takes about 6 seconds to open an
Inspector. The script uses BioSmalltalk, and the code could be enhanced for
sure, but that is not relevant to my performance problem of visualization:

[
| text attributes |
" Generate a Text object from a random sequence "
text := ((BioSequence forAlphabet: BioDNAAlphabet) randomLength: 1000)
sequence asText.
" Setup an array for each nucleotide background color "
attributes := Array new: text size.
1 to: text size do: [ : index |
attributes at: index put: {
(TextBackgroundColor color: (BioDNAAlphabet colorMap at: (text at: index)))
}  ].
text runs: (RunArray newFrom: attributes).
text inspect
] timeToRun asString  "'0:00:00:05.911'"

Also, resizing the opened Inspector takes 2-3 seconds to refresh.
You can see the output here: https://imgur.com/a/xUlBeVY

I should say without the #inspect the code ran without performance issues:
"'0:00:00:00.009'"

So I ran again the script for different sequence sizes:

String streamContents: [ : stream |
100 to: 2000 by: 100 do: [ : sl |
stream nextPutAll: ([
| text attributes |
" Generate a Text object from a random sequence "
text := ((BioSequence forAlphabet: BioDNAAlphabet) randomLength: sl)
sequence asText.
" Setup an array for each nucleotide background color "
attributes := Array new: text size.
1 to: text size do: [ : index |
attributes at: index put: {
(TextBackgroundColor color: (BioDNAAlphabet colorMap at: (text at: index)))
}  ].
text runs: (RunArray newFrom: attributes).
text inspect
] timeToRun asString);
cr
]
]

And these are the results:

0:00:00:00.147
0:00:00:00.28
0:00:00:00.568
0:00:00:00.993
0:00:00:01.776
0:00:00:02.123
0:00:00:03.111
0:00:00:04.084
0:00:00:04.574
0:00:00:06.192
0:00:00:07.214
0:00:00:07.915
0:00:00:10.382
0:00:00:12.725
0:00:00:12.359
0:00:00:17.357
0:00:00:17.147
0:00:00:20.651
0:00:00:20.392
0:00:00:23.238

At first I thought it was a problem of the Glamout text renderer for Rubric
Text, but profiling a single pass of the snippet for 2000 letters, shows a
couple of methods in Rubric scanner, after some DNU sends, which are
consuming a lot of the time:
RubCharacterBlockScanner(RubCharacterBlockScanner) >>
characterBlockAtPoint:index:in: and
RubCharacterBlockScanner(RubCharacterBlockScanner) >> endOfRun". I attached
the full profiler report so you may have a look if you like. But the
summary is:

**Leaves**
37.4% {8800ms}
RubCompositionScanner(RubCharacterScanner)>>basicScanCharactersFrom:to:in:rightX:stopConditions:kern:
6.3% {1476ms} Dictionary>>at:ifAbsentPut:
6.1% {1425ms} Context>>unwindComplete
4.6% {1082ms} Semaphore>>criticalReleasingOnError:
4.2% {991ms} Dictionary>>at:ifAbsent:
3.3% {785ms} Context>>aboutToReturn:through:
2.2% {527ms} Context>>resume:through:
2.0% {470ms} ExternalAddress>>isNull
1.8% {421ms} BlockClosure>>on:do:
1.7% {402ms}
RubCharacterBlockScanner(RubCharacterScanner)>>setConditionArray:
1.6% {378ms} FreeTypeFace>>validate
1.6% {376ms} Dictionary>>scanFor:
1.5% {364ms} Context>>unwindComplete:
1.5% {344ms} Context>>unwindBlock
1.4% {323ms} Array(SequenceableCollection)>>do:
1.3% {299ms} Dictionary(HashedCollection)>>findElementOrNil:
1.2% {293ms} RunArray>>at:setRunOffsetAndValue:
1.2% {289ms} FreeTypeCache>>atFont:charCode:type:ifAbsentPut:
1.1% {252ms} FreeTypeCacheLinkedList>>moveDown:

**Memory**
old +0 bytes
young -1,485,272 bytes
used -1,485,272 bytes
free +1,485,272 bytes

**GCs**
full 0 totalling 0ms (0.0% uptime)
incr 947 totalling 1,576ms (7.0% uptime), avg 2.0ms
tenures 0
root table 0 overflows

So my question is, is there any other text rendering backends to try? And
when I say backends I say which don't use Rubric.

Cheers,

Hernán
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.pharo.org/pipermail/pharo-users_lists.pharo.org/attachments/20200221/0c161ec5/attachment-0001.html>
-------------- next part --------------
 - 23517 tallies, 23528 msec.

**Tree**
--------------------------------
Process: (40s) Morphic UI Process: nil
--------------------------------
99.1% {23313ms} UndefinedObject>>DoIt
  99.0% {23300ms} Text(Object)>>inspect
    99.0% {23300ms} GTInspector class>>inspect:
      99.0% {23300ms} GTInspector class>>openOn:
        99.0% {23300ms} GTInspector>>openOn:
          99.0% {23300ms} GTInspector(GLMCompositePresentation)>>openOn:
            99.0% {23300ms} GTInspector(GLMCompositePresentation)>>openOn:with:
              99.0% {23298ms} GTInspector(GLMCompositePresentation)>>openWith:
                99.0% {23298ms} GLMMorphicRenderer>>open:
                  99.0% {23285ms} GLMMorphicWindowRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                    99.0% {23285ms} GLMMorphicWindowRenderer>>render:
                      98.9% {23274ms} GLMMorphicWindowRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                        98.9% {23274ms} GLMMorphicRenderer(GLMRenderer)>>render:
                          98.9% {23274ms} GTInspector(GLMCompositePresentation)>>renderGlamorouslyOn:
                            98.9% {23274ms} GLMTabbedArrangement>>renderGlamorouslyOn:
                              98.9% {23274ms} GLMMorphicRenderer>>renderTabbedCompositePresentation:
                                98.9% {23274ms} GLMMorphicTabbedRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                  98.9% {23274ms} GLMMorphicTabbedRenderer>>render:
                                    98.9% {23274ms} GLMMorphicTabbedRenderer(GLMMorphicWidgetRenderer)>>renderWithTitleOrNil:
                                      98.9% {23274ms} GLMMorphicTabbedRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                                        98.9% {23274ms} GLMMorphicRenderer(GLMRenderer)>>render:
                                          98.9% {23274ms} GLMPager>>renderGlamorouslyOn:
                                            98.9% {23274ms} GLMMorphicRenderer>>renderPager:
                                              98.9% {23274ms} GLMMorphicPagerRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                                98.9% {23274ms} GLMMorphicPagerRenderer>>render:
                                                  98.9% {23270ms} OrderedCollection>>do:
                                                    98.9% {23270ms} GLMMorphicPagerRenderer>>render:
                                                      98.9% {23268ms} GLMMorphicPagerRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                                                        98.9% {23268ms} GLMMorphicRenderer(GLMRenderer)>>render:
                                                          98.9% {23268ms} GLMPane>>renderGlamorouslyOn:
                                                            98.9% {23268ms} GLMMorphicRenderer>>renderPane:
                                                              98.9% {23268ms} GLMMorphicPaneRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                                                98.9% {23268ms} GLMMorphicPaneRenderer>>render:
                                                                  98.9% {23268ms} GLMMorphicPaneRenderer>>renderContainerFor:
                                                                    98.9% {23262ms} GLMMorphicPaneRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                                                                      98.9% {23262ms} GLMMorphicRenderer(GLMRenderer)>>render:
                                                                        98.9% {23262ms} GLMCompositePresentation>>renderGlamorouslyOn:
                                                                          98.9% {23262ms} GLMTabbedArrangement>>renderGlamorouslyOn:
                                                                            98.9% {23262ms} GLMMorphicRenderer>>renderTabbedCompositePresentation:
                                                                              98.9% {23262ms} GLMMorphicTabbedRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                                                                98.9% {23262ms} GLMMorphicTabbedRenderer>>render:
                                                                                  98.9% {23262ms} GLMMorphicTabbedRenderer(GLMMorphicWidgetRenderer)>>renderWithTitleOrNil:
                                                                                    98.9% {23262ms} GLMMorphicTabbedRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                                                                                      98.9% {23262ms} GLMMorphicRenderer(GLMRenderer)>>render:
                                                                                        98.9% {23262ms} GLMDynamicPresentation>>renderGlamorouslyOn:
                                                                                          98.9% {23262ms} GLMMorphicRenderer>>renderDynamicPresentation:
                                                                                            98.9% {23262ms} GLMMorphicDynamicRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                                                                              98.9% {23262ms} GLMMorphicDynamicRenderer>>render:
                                                                                                98.9% {23260ms} GLMMorphicDynamicRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                                                                                                  98.9% {23260ms} GLMMorphicRenderer(GLMRenderer)>>render:
                                                                                                    98.9% {23260ms} GLMCompositePresentation>>renderGlamorouslyOn:
                                                                                                      98.9% {23260ms} GLMTabbedArrangement>>renderGlamorouslyOn:
                                                                                                        98.9% {23260ms} GLMMorphicRenderer>>renderTabbedCompositePresentation:
                                                                                                          98.9% {23260ms} GLMMorphicTabbedRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                                                                                            98.9% {23260ms} GLMMorphicTabbedRenderer>>render:
                                                                                                              98.9% {23260ms} GLMMorphicTabbedRenderer(GLMMorphicWidgetRenderer)>>renderWithTitleOrNil:
                                                                                                                98.9% {23260ms} GLMMorphicTabbedRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                                                                                                                  98.9% {23260ms} GLMMorphicRenderer(GLMRenderer)>>render:
                                                                                                                    98.9% {23260ms} GLMCompositePresentation>>renderGlamorouslyOn:
                                                                                                                      98.9% {23260ms} GLMTabbedArrangement>>renderGlamorouslyOn:
                                                                                                                        98.9% {23260ms} GLMMorphicRenderer>>renderTabbedCompositePresentation:
                                                                                                                          98.9% {23260ms} GLMMorphicTabbedRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                                                                                                            98.9% {23260ms} GLMMorphicTabbedRenderer>>render:
                                                                                                                              98.8% {23252ms} GLMAnnouncer>>suspendAllWhile:
                                                                                                                                98.8% {23252ms} BlockClosure>>ensure:
                                                                                                                                  98.8% {23252ms} GLMMorphicTabbedRenderer>>render:
                                                                                                                                    98.8% {23252ms} LazyTabGroupMorph(TabGroupMorph)>>selectedPageIndex:
                                                                                                                                      98.8% {23252ms} GLMTabSelectorBrick>>selectedIndex:
                                                                                                                                        98.8% {23252ms} GLMTabSelectorBrick(Morph)>>changed:with:
                                                                                                                                          98.8% {23252ms} GLMTabSelectorBrick(Morph)>>doAnnounce:
                                                                                                                                            98.8% {23252ms} Announcer>>announce:
                                                                                                                                              98.8% {23252ms} SubscriptionRegistry>>deliver:
                                                                                                                                                98.8% {23252ms} SubscriptionRegistry>>deliver:to:
                                                                                                                                                  98.8% {23252ms} SubscriptionRegistry>>deliver:to:startingAt:
                                                                                                                                                    98.8% {23252ms} BlockClosure>>ifCurtailed:
                                                                                                                                                      98.8% {23252ms} SubscriptionRegistry>>deliver:to:startingAt:
                                                                                                                                                        98.8% {23252ms} AnnouncementSubscription>>deliver:
                                                                                                                                                          98.8% {23252ms} BlockClosure>>on:fork:
                                                                                                                                                            98.8% {23252ms} BlockClosure>>on:do:
                                                                                                                                                              98.8% {23252ms} AnnouncementSubscription>>deliver:
                                                                                                                                                                98.8% {23252ms} MessageSend>>cull:cull:
                                                                                                                                                                  98.8% {23252ms} MessageSend>>cull:
                                                                                                                                                                    98.8% {23252ms} MessageSend>>value:
                                                                                                                                                                      98.8% {23252ms} LazyTabGroupMorph(Morph)>>handleUpdate:
                                                                                                                                                                        98.8% {23252ms} MorphChangedWithArguments>>deliverTo:
                                                                                                                                                                          98.8% {23252ms} LazyTabGroupMorph(Object)>>update:with:
                                                                                                                                                                            98.8% {23252ms} LazyTabGroupMorph(TabGroupMorph)>>update:
                                                                                                                                                                              98.8% {23252ms} LazyTabGroupMorph>>updatePageIndex:
                                                                                                                                                                                98.8% {23252ms} LazyTabGroupMorph>>pageAt:
                                                                                                                                                                                  98.8% {23252ms} LazyTabPage>>actualPageMorph
                                                                                                                                                                                    98.8% {23252ms} GLMMorphicTabbedRenderer>>render:
                                                                                                                                                                                      98.8% {23252ms} GLMMorphicTabbedRenderer(GLMMorphicWidgetRenderer)>>renderObject:
                                                                                                                                                                                        98.8% {23252ms} GLMMorphicRenderer(GLMRenderer)>>render:
                                                                                                                                                                                          98.8% {23252ms} GLMRubricTextPresentation>>renderGlamorouslyOn:
                                                                                                                                                                                            98.8% {23252ms} GLMMorphicRenderer>>renderRubricTextPresentation:
                                                                                                                                                                                              98.8% {23252ms} GLMMorphicRubricTextRenderer class(GLMMorphicWidgetRenderer class)>>render:from:
                                                                                                                                                                                                98.8% {23252ms} GLMMorphicRubricTextRenderer>>render:
                                                                                                                                                                                                  97.1% {22842ms} GLMMorphicRubricTextRenderer>>morph
                                                                                                                                                                                                    |97.1% {22835ms} RubScrolledTextMorph>>model:
[97.1% {22835ms} RubScrolledTextMorph>>setTextWith:
[  97.0% {22831ms} RubTextScrollPane>>setTextWith:
[    97.0% {22831ms} RubEditingArea(RubAbstractTextArea)>>setTextWith:
[      97.0% {22831ms} RubEditingArea(RubAbstractTextArea)>>handleParagraphChange:
[        97.0% {22829ms} RubEditingArea(RubAbstractTextArea)>>compose
[          97.0% {22818ms} RubEditingArea(RubAbstractTextArea)>>markBackgroundColors
[            97.0% {22818ms} RunArray>>withStartStopAndValueDo:
[              97.0% {22818ms} Array(SequenceableCollection)>>with:do:
[                97.0% {22815ms} RunArray>>withStartStopAndValueDo:
[                  97.0% {22813ms} RubEditingArea(RubAbstractTextArea)>>markBackgroundColors
[                    97.0% {22813ms} Array(SequenceableCollection)>>do:
[                      97.0% {22813ms} RubEditingArea(RubAbstractTextArea)>>markBackgroundColors
[                        96.9% {22799ms} RubEditingArea(RubAbstractTextArea)>>addSegment:
[                          96.8% {22778ms} RubTextBackgroundColorSegmentMorph(RubTextSegmentMorph)>>inTextArea:
[                            96.8% {22778ms} RubTextBackgroundColorSegmentMorph(RubTextSegmentMorph)>>computeVertices
[                              96.8% {22778ms} RubTextBackgroundColorSegmentMorph(RubTextSegmentMorph)>>computeStraightVertices
[                                96.6% {22728ms} RubTextBackgroundColorSegmentMorph(RubTextSegmentMorph)>>characterBlockForIndex:
[                                  96.6% {22719ms} RubCurrentLineBarDecorator(RubParagraphDecorator)>>doesNotUnderstand:
[                                    96.6% {22717ms} BlockClosure>>on:do:
[                                      96.6% {22717ms} RubCurrentLineBarDecorator(RubParagraphDecorator)>>doesNotUnderstand:
[                                        96.6% {22717ms} Message>>sendTo:
[                                          96.6% {22717ms} RubExtraSelectionDecorator(RubParagraphDecorator)>>doesNotUnderstand:
[                                            96.5% {22713ms} BlockClosure>>on:do:
[                                              96.5% {22713ms} RubExtraSelectionDecorator(RubParagraphDecorator)>>doesNotUnderstand:
[                                                96.5% {22713ms} Message>>sendTo:
[                                                  96.5% {22713ms} RubOpeningClosingDelimiterDecorator(RubParagraphDecorator)>>doesNotUnderstand:
[                                                    96.5% {22713ms} BlockClosure>>on:do:
[                                                      96.5% {22711ms} RubOpeningClosingDelimiterDecorator(RubParagraphDecorator)>>doesNotUnderstand:
[                                                        96.5% {22711ms} Message>>sendTo:
[                                                          96.5% {22711ms} RubParagraph>>characterBlockForIndex:
[                                                            96.5% {22707ms} RubCharacterBlockScanner>>characterBlockAtPoint:index:in:
[                                                              46.4% {10909ms} RubCharacterBlockScanner(RubCharacterScanner)>>scanCharactersFrom:to:in:rightX:stopConditions:kern:
[                                                                |46.2% {10865ms} RubCharacterBlockScanner(RubCharacterScanner)>>basicScanCharactersFrom:to:in:rightX:stopConditions:kern:
[                                                                |  36.9% {8690ms} primitives
[                                                                |  7.9% {1859ms} LogicalFont>>widthAndKernedWidthOfLeft:right:into:
[                                                                |    6.4% {1500ms} FreeTypeFont>>widthAndKernedWidthOfLeft:right:into:
[                                                                |      |5.9% {1398ms} Dictionary>>at:ifAbsentPut:
[                                                                |      |  4.5% {1062ms} primitives
[                                                                |      |  1.4% {335ms} Dictionary>>at:ifAbsent:
[                                                                |    1.2% {279ms} LogicalFont>>realFont
[                                                                |      1.1% {265ms} FreeTypeFont>>validate
[                                                              30.5% {7174ms} RubCharacterBlockScanner>>endOfRun
[                                                                |28.5% {6713ms} RubCharacterBlockScanner>>setStopConditions
[                                                                |  |25.9% {6085ms} RubCharacterBlockScanner>>setFont
[                                                                |  |  |25.8% {6079ms} RubCharacterBlockScanner(RubCharacterScanner)>>setFont
[                                                                |  |  |  18.3% {4299ms} LogicalFont>>widthOf:
[                                                                |  |  |    |17.6% {4130ms} FreeTypeFont>>widthOf:
[                                                                |  |  |    |  17.4% {4091ms} FreeTypeFont>>linearWidthOf:
[                                                                |  |  |    |    17.0% {3990ms} FreeTypeCache>>atFont:charCode:type:ifAbsentPut:
[                                                                |  |  |    |      16.4% {3867ms} Semaphore>>criticalReleasingOnError:
[                                                                |  |  |    |        15.7% {3694ms} BlockClosure>>ensure:
[                                                                |  |  |    |          13.7% {3222ms} Semaphore>>criticalReleasingOnError:
[                                                                |  |  |    |            |13.7% {3222ms} BlockClosure>>on:do:
[                                                                |  |  |    |            |  12.8% {3013ms} FreeTypeCache>>atFont:charCode:type:ifAbsentPut:
[                                                                |  |  |    |            |    7.5% {1759ms} Context>>aboutToReturn:through:
[                                                                |  |  |    |            |      |5.4% {1265ms} Context>>return:through:
[                                                                |  |  |    |            |      |  |5.2% {1231ms} Context>>resume:through:
[                                                                |  |  |    |            |      |  |  3.0% {696ms} Context>>unwindComplete
[                                                                |  |  |    |            |      |1.6% {380ms} primitives
[                                                                |  |  |    |            |    3.2% {761ms} Dictionary>>at:ifAbsentPut:
[                                                                |  |  |    |            |      |2.3% {551ms} Dictionary>>at:ifAbsent:
[                                                                |  |  |    |            |      |  1.5% {348ms} Dictionary(HashedCollection)>>findElementOrNil:
[                                                                |  |  |    |            |    1.1% {254ms} FreeTypeCacheLinkedList>>moveDown:
[                                                                |  |  |    |          2.0% {472ms} Context>>resume:through:
[                                                                |  |  |    |            1.5% {363ms} Semaphore>>criticalReleasingOnError:
[                                                                |  |  |  2.7% {632ms} LogicalFont>>descentKern
[                                                                |  |  |    |1.7% {411ms} LogicalFont>>realFont
[                                                                |  |  |    |  1.6% {386ms} FreeTypeFont>>validate
[                                                                |  |  |  1.6% {371ms} Array(SequenceableCollection)>>do:
[                                                                |  |  |    1.3% {314ms} primitives
[                                                                |  |1.7% {402ms} RubCharacterBlockScanner(RubCharacterScanner)>>setConditionArray:
[                                                                |1.3% {313ms} Text>>runLengthFor:
[                                                                |  1.2% {286ms} RunArray>>runLengthAt:
[                                                                |    1.2% {272ms} RunArray>>at:setRunOffsetAndValue:
[                                                              17.9% {4223ms} LogicalFont>>widthOf:
[                                                                16.8% {3963ms} FreeTypeFont>>widthOf:
[                                                                  |16.6% {3912ms} FreeTypeFont>>linearWidthOf:
[                                                                  |  16.2% {3817ms} FreeTypeCache>>atFont:charCode:type:ifAbsentPut:
[                                                                  |    15.7% {3701ms} Semaphore>>criticalReleasingOnError:
[                                                                  |      15.0% {3524ms} BlockClosure>>ensure:
[                                                                  |        12.9% {3028ms} Semaphore>>criticalReleasingOnError:
[                                                                  |          |12.9% {3028ms} BlockClosure>>on:do:
[                                                                  |          |  12.0% {2832ms} FreeTypeCache>>atFont:charCode:type:ifAbsentPut:
[                                                                  |          |    7.2% {1700ms} Context>>aboutToReturn:through:
[                                                                  |          |      |5.0% {1188ms} Context>>return:through:
[                                                                  |          |      |  |5.0% {1180ms} Context>>resume:through:
[                                                                  |          |      |  |  3.1% {720ms} Context>>unwindComplete
[                                                                  |          |      |1.7% {399ms} primitives
[                                                                  |          |    2.6% {611ms} Dictionary>>at:ifAbsentPut:
[                                                                  |          |      |1.8% {429ms} Dictionary>>at:ifAbsent:
[                                                                  |          |    1.1% {265ms} FreeTypeCacheLinkedList>>moveDown:
[                                                                  |        2.1% {495ms} Context>>resume:through:
[                                                                  |          1.5% {360ms} Semaphore>>criticalReleasingOnError:
[                                                                1.0% {239ms} LogicalFont>>realFont
                                                                                                                                                                                                  1.6% {366ms} RubScrolledTextMorph>>wrapped:
                                                                                                                                                                                                    1.6% {366ms} RubTextScrollPane>>wrapped:
[1.6% {366ms} RubTextScrollPane>>handleWrappingPolicyChange:
[  1.5% {364ms} RubTextScrollPane>>fitScrollTargetWidth
[    1.5% {364ms} RubEditingArea(Morph)>>width:
[      1.5% {364ms} RubEditingArea(RubAbstractTextArea)>>extent:
[        1.5% {364ms} RubEditingArea(RubAbstractTextArea)>>handleBoundsChange:
[          1.1% {252ms} RubEditingArea(RubAbstractTextArea)>>extent:
[            1.1% {250ms} RubParagraph>>extentFromClientBottomRight:
[              1.1% {250ms} RubParagraph>>compose
[                1.1% {250ms} RubParagraph>>disableDrawingWhile:
[                  1.1% {250ms} BlockClosure>>ensure:
[                    1.1% {250ms} RubParagraph>>compose

**Leaves**
37.4% {8800ms} RubCompositionScanner(RubCharacterScanner)>>basicScanCharactersFrom:to:in:rightX:stopConditions:kern:
6.3% {1476ms} Dictionary>>at:ifAbsentPut:
6.1% {1425ms} Context>>unwindComplete
4.6% {1082ms} Semaphore>>criticalReleasingOnError:
4.2% {991ms} Dictionary>>at:ifAbsent:
3.3% {785ms} Context>>aboutToReturn:through:
2.2% {527ms} Context>>resume:through:
2.0% {470ms} ExternalAddress>>isNull
1.8% {421ms} BlockClosure>>on:do:
1.7% {402ms} RubCharacterBlockScanner(RubCharacterScanner)>>setConditionArray:
1.6% {378ms} FreeTypeFace>>validate
1.6% {376ms} Dictionary>>scanFor:
1.5% {364ms} Context>>unwindComplete:
1.5% {344ms} Context>>unwindBlock
1.4% {323ms} Array(SequenceableCollection)>>do:
1.3% {299ms} Dictionary(HashedCollection)>>findElementOrNil:
1.2% {293ms} RunArray>>at:setRunOffsetAndValue:
1.2% {289ms} FreeTypeCache>>atFont:charCode:type:ifAbsentPut:
1.1% {252ms} FreeTypeCacheLinkedList>>moveDown:

**Memory**
	old			+0 bytes
	young		-1,485,272 bytes
	used		-1,485,272 bytes
	free		+1,485,272 bytes

**GCs**
	full			0 totalling 0ms (0.0% uptime)
	incr		947 totalling 1,576ms (7.0% uptime), avg 2.0ms
	tenures		0
	root table	0 overflows


More information about the Pharo-users mailing list