Here is a simple bench:
(StringHolder new contents: (Compiler evaluate: (FileStream fileNamed: '
text.st') contentsOfEntireFile )) openLabel: 'Working With Squeak 2' .
((SystemWindow allSubInstances detect: [:e | e label = 'Working With Squeak 2']) findDeepSubmorphThat: [:m | m class = PluggableTextMorphPlus] ifAbsent: [] ) textMorph
ifNotNil: [:tm | MessageTally spyOn: [
[100 timesRepeat: [(NewParagraph new)
compose: tm text
style: tm textStyle copy
from: 1
in: tm container]] timeToRun]].
Before our changes: 162 ms
After our changes: 95 ms
And my Pharo 3.0 (#30417) (not up to date) : 364 ms
The main gain is avoiding
- the stopConditions copy
- and the TextStopConditions indirection
- and of course the Multi* when not necessary (Pharo does not)
Here is the test for Pharo variant:
text := Compiler evaluate: (FileSystem workingDirectory parent parent parent / '
text.st' ) readStream contentsOfEntireFile .
(StringHolder new contents: text) openLabel: 'Working With Squeak 2' .
((SystemWindow allSubInstances detect: [:e | e label = 'Working With Squeak 2']) findDeepSubmorphThat: [:m | m class = PluggableTextMorph] ifAbsent: [] ) textMorph
ifNotNil: [:tm | MessageTally spyOn: [
[100 timesRepeat: [(Paragraph new)
compose: text
style: tm textStyle copy
from: 1
in: tm container]] timeToRun]].