"Andreas Raab" Andreas.Raab@gmx.de is claimed by the authorities to have written:
Tim,
What performance problems are you seeing?
General tardiness in a non-descript way.
[...]
I suppose we really need some good meaningful test scenarios that can be automated and profiled to really try to sort this out.
Well, then let's get started. You say that opening menus hurts?! So how about (from a workspace):
Hokay, on my Acorn this resuts in:- - 2829 tallies, 66170 msec.
**Tree** 75.3% {49826ms} PasteUpMorph>>doOneCycleNow |75.3% {49826ms} WorldState>>doOneCycleNowFor: | 71.7% {47444ms} WorldState>>displayWorldSafely: | |71.5% {47312ms} PasteUpMorph>>displayWorld | | 71.4% {47245ms} PasteUpMorph>>privateOuterDisplayWorld | | 71.4% {47245ms} WorldState>>displayWorld:submorphs: | | 61.7% {40827ms} WorldState>>drawWorld:submorphs:invalidAreasOn: | | |59.2% {39173ms} FormCanvas(Canvas)>>fullDrawMorph: | | | 59.2% {39173ms} FormCanvas(Canvas)>>fullDraw: | | | 59.2% {39173ms} SystemWindow(Morph)>>fullDrawOn: | | | 54.7% {36195ms} SystemWindow(Morph)>>drawSubmorphsOn: | | | |54.4% {35996ms} FormCanvas(Canvas)>>fullDrawMorph: | | | | 54.3% {35930ms} FormCanvas(Canvas)>>fullDraw: | | | | 54.3% {35930ms} AlignmentMorph(Morph)>>fullDrawOn: | | | | 40.1% {26534ms} AlignmentMorph(Morph)>>drawSubmorphsOn: | | | | |39.8% {26336ms} FormCanvas(Canvas)>>fullDrawMorph: | | | | | 39.7% {26269ms} FormCanvas(Canvas)>>fullDraw: [39.5% {26137ms} RectangleMorph(Morph)>>fullDrawOn: [ 11.0% {7279ms} FormCanvas(Canvas)>>roundCornersOf:during: [ |11.0% {7279ms} FormCanvas>>roundCornersOf:in:during: [ | 10.5% {6948ms} CornerRounder class>>roundCornersOf:on:i...orderWidth:corners: [ | 7.4% {4897ms} CornerRounder>>tweakCornersOf:on:in:borderWidth:corners: [ | |2.2% {1456ms} Form(DisplayObject)>>displayOn:at:rule: [ | 3.1% {2051ms} CornerRounder>>saveBitsUnderCornersOf:on:in:corners: [ 10.8% {7146ms} IconicButton(Morph)>>drawSubmorphsOn: [ |10.5% {6948ms} FormCanvas(Canvas)>>fullDrawMorph: [ | 10.4% {6882ms} FormCanvas(Canvas)>>fullDraw: [ | 10.3% {6816ms} SketchMorph(Morph)>>fullDrawOn: [ | 3.1% {2051ms} TransformMorph>>drawSubmorphsOn: [ | |3.0% {1985ms} FormCanvas(Canvas)>>fullDrawMorph: [ | | 3.0% {1985ms} FormCanvas(Canvas)>>fullDraw: [ | | 3.0% {1985ms} TextMorphForEditView(Morph)>>fullDrawOn: [ | | 2.7% {1787ms} FormCanvas(Canvas)>>drawMorph: [ | | 2.7% {1787ms} FormCanvas(Canvas)>>draw: [ | 3.0% {1985ms} FormCanvas(Canvas)>>roundCornersOf:during: [ | |3.0% {1985ms} FormCanvas>>roundCornersOf:in:during: [ | | 2.9% {1919ms} CornerRounder class>>roundCornersOf:on:i...orderWidth:corners: [ | 2.2% {1456ms} FormCanvas(Canvas)>>drawMorph: [ | 2.2% {1456ms} FormCanvas(Canvas)>>draw: [ 8.8% {5823ms} FormCanvas(Canvas)>>drawMorph: [ |8.8% {5823ms} FormCanvas(Canvas)>>draw: [ | 7.3% {4830ms} RectangleMorph(Morph)>>drawOn: [ | 6.4% {4235ms} FormCanvas(Canvas)>>fillRectangle:fillStyle:borderStyle: [ | 2.5% {1654ms} SimpleBorder>>frameRectangle:on: [ | |2.4% {1588ms} FormCanvas>>frameAndFillRectangle:fi...Color:bottomRightColor: [ | 2.1% {1390ms} FormCanvas>>fillRectangle:fillStyle: [ 6.2% {4103ms} TransformMorph>>drawSubmorphsOn: [ 5.7% {3772ms} FormCanvas(Canvas)>>fullDrawMorph: [ 5.4% {3573ms} FormCanvas(Canvas)>>fullDraw: [ 5.3% {3507ms} StringMorph(Morph)>>fullDrawOn: [ 2.7% {1787ms} FormCanvas(Canvas)>>drawMorph: [ 2.7% {1787ms} FormCanvas(Canvas)>>draw: [ 2.7% {1787ms} StringMorph>>drawOn: [ 2.6% {1720ms} FormCanvas(Canvas)>>drawString:in:font:color: [ 2.6% {1720ms} FormCanvas>>drawString:from:to:in:font:color: | | | | 10.4% {6882ms} FormCanvas(Canvas)>>drawMorph: | | | | 10.4% {6882ms} FormCanvas(Canvas)>>draw: | | | | 3.3% {2184ms} MenuItemMorph>>drawOn: [2.9% {1919ms} MenuItemMorph(StringMorph)>>drawOn: [ 2.9% {1919ms} FormCanvas(Canvas)>>drawString:in:font:color: [ 2.9% {1919ms} FormCanvas>>drawString:from:to:in:font:color: | | | | 2.3% {1522ms} ProjectViewMorph>>drawOn: | | | | 2.1% {1390ms} PluggableListMorph>>drawOn: | | | 3.7% {2448ms} FormCanvas(Canvas)>>drawMorph: | | | 3.7% {2448ms} FormCanvas(Canvas)>>draw: | | | 2.7% {1787ms} SystemWindow(Morph)>>drawOn: | | | 2.6% {1720ms} FormCanvas(Canvas)>>fillRectangle:fillStyle:borderStyle: | | 9.6% {6352ms} WorldState>>forceDamageToScreen: | | 9.6% {6352ms} DisplayScreen>>forceDamageToScreen: | | 9.5% {6286ms} DisplayScreen>>forceToScreen: | 3.1% {2051ms} HandMorph>>processEvents | 3.0% {1985ms} EventSensor>>nextEvent | 3.0% {1985ms} EventSensor>>nextEventFromQueue 18.0% {11911ms} MenuMorph>>popUpAt:forHand:in: |17.9% {11844ms} MenuMorph>>popUpAt:forHand:in:allowKeyboard: | 15.7% {10389ms} PasteUpMorph>>addMorphFront: | 15.7% {10389ms} PasteUpMorph(Morph)>>addMorphInFrontOfLayer: | 15.7% {10389ms} PasteUpMorph(Morph)>>addMorph:inFrontOf: | 15.7% {10389ms} PasteUpMorph(Morph)>>privateAddMorph:atIndex: | 15.4% {10190ms} PasteUpMorph(Morph)>>addedOrRemovedSubmorph: | 15.4% {10190ms} MenuMorph(Morph)>>fullBounds | 15.4% {10190ms} MenuMorph(Morph)>>doLayoutIn: | 13.7% {9065ms} TableLayout>>layout:in: | 13.7% {9065ms} TableLayout>>layoutTopToBottom:in: | 8.6% {5691ms} MenuItemMorph(Morph)>>layoutInBounds: | |5.1% {3375ms} MenuItemMorph(Morph)>>bounds: | | 2.7% {1787ms} MenuItemMorph(Morph)>>extent: | | |2.5% {1654ms} MenuItemMorph(Morph)>>changed | | | 2.1% {1390ms} MenuItemMorph(Morph)>>invalidRect: | | | 2.1% {1390ms} MenuItemMorph(Morph)>>invalidRect:from: | | 2.3% {1522ms} MenuItemMorph(Morph)>>position: | 4.2% {2779ms} MenuItemMorph(Morph)>>minExtent 5.1% {3375ms} PluggableListMorph>>getMenu: 5.1% {3375ms} PluggableListMorph(ScrollPane)>>getMenu: **Leaves** 9.5% {6286ms} DisplayScreen>>forceToScreen: 7.0% {4632ms} GrafPort>>copyBits 5.7% {3772ms} GrafPort(BitBlt)>>displayString:from:to:at:strikeFont:kern: 4.6% {3044ms} IdentityDictionary>>scanFor: 3.5% {2316ms} Point>>+ 3.5% {2316ms} Rectangle class>>origin:corner: 3.0% {1985ms} EventSensor>>nextEventFromQueue 2.5% {1654ms} Form>>copyBits:from:at:clippingBox:rule:fillColor:map: 2.2% {1456ms} SmallInteger class(Behavior)>>inheritsFrom: 2.2% {1456ms} IdentityDictionary(Dictionary)>>at:ifAbsent:
**Memory** old +194,044 bytes young -98,752 bytes used +95,292 bytes free -95,292 bytes
**GCs** full 0 totalling 0ms (0.0% uptime) incr 328 totalling 4,470ms (7.0% uptime), avg 14.0ms tenures 4 (avg 82 GCs/tenure) root table 0 overflows
As you can see, its pretty slow - 66 seconds! Some observations - corner rouding is turned off, so I'm a bit surprised to see CornerRounder in there. #forceToScreen: is a big hit because I can't get it (in the vm) to work without looking for all events (it should work, but it just won't.) TableLayout? in a menu?
tim