So here is the display mini bench: | text canvas m1 m2 | canvas := FormCanvas extent: 569@399 depth: 32. text := Compiler evaluate: (FileSystem workingDirectory parent parent parent / 'text.st' ) readStream contentsOfEntireFile . m1 := TextMorph new. m1 text: text textStyle: TextStyle default. m1 wrapFlag: true. m1 extent: 569@9999999. MessageTally spyOn: [ 100 timesRepeat: [ m1 drawOn: canvas]]. m2 := TxTextMorph new. m2 layoutStrategy: TxWrapTextStrategy new. m2 extent: 569@9999999. m2 newTextContents: text. MessageTally spyOn: [ 100 timesRepeat: [ m2 drawOn: canvas]]. Squeak revised BitBltDisplayScanner 1077ms / Pharo MultiDisplayScanner 1229ms / Pharo TxText 1584ms But the tallies does not make sense, we should better use Andreas tallying... 2013/10/11 Nicolas Cellier <nicolas.cellier.aka.nice@gmail.com>
OK Igor, I loaded ConfigurationOfTxText and I understand what you say: - TxText spend more time in composing layout because it records each and every TxSpanInterval - this will later accelerate display, because no scanning is required at display time On the base that you compose once and display many, this is a Memory/CPU trading that would not have been a good idea the 70's (birth of CharacterScanner family), but is now fair.
Even if that does not make much sense, composition (layout building) can be measured with this kind of mini bench:
| text | text := Compiler evaluate: (FileSystem workingDirectory parent parent parent / 'text.st' ) readStream contentsOfEntireFile . MessageTally spyOn: [[100 timesRepeat: [(Paragraph new) compose: text style: TextStyle default copy from: 1 in: ( 0@0 corner: 569@9999999)]] timeToRun ]. MessageTally spyOn: [ 100 timesRepeat: [| m | m := TxTextMorph new. m layoutStrategy: TxWrapTextStrategy new. m extent: 569@9999999. m newTextContents: text]]
95ms in revised Squeak CompositionScanner / 366ms Pharo MultiCcompositionScanner / 347ms TxText
I'll try to write a mini bench to measure display only on a Form with StrikeFont and BitBlt...
2013/10/11 Camille Teruel <camille.teruel@gmail.com>
On 11 oct. 2013, at 20:25, Stéphane Ducasse wrote:
Hi
I discuss with igor and its new design precomputes everything so we will see. What would be good is to have another guy looking at what igor is doing because now that fernando transformed himself in a puff of smoke, igor is alone with me looking at it form time to time.
Me when I come back. We have to work on the editor together anyway.
Stef On Oct 11, 2013, at 1:08 PM, plantec <alain.plantec@yahoo.com> wrote:
Le 11 oct. 2013 Ã 08:15, Denis Kudriashov <dionisiydk@gmail.com> a
écrit :
Me too.
What exactly doing this code?
Paragraph new compose: tm text style: tm textStyle copy from: 1 in:
Is it layout building stuff at new text model?
I think yes. It composes a Text as a collection of TextLine. Alain
2013/10/11 Stéphane Ducasse <stephane.ducasse@inria.fr> Hi Igor
it would be good to see how the new text model perform.
Stef
Begin forwarded message:
From: Nicolas Cellier <nicolas.cellier.aka.nice@gmail.com> Subject: Fwd: Small text composition bench Date: October 10, 2013 10:46:42 PM GMT+02:00 To: Stéphane Ducasse <stephane.ducasse@inria.fr>
---------- Forwarded message ---------- From: Nicolas Cellier <nicolas.cellier.aka.nice@gmail.com> Date: 2013/10/10 Subject: Small text composition bench To: The general-purpose Squeak developers list <
squeak-dev@lists.squeakfoundation.org>
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 | 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]].