Morphic slowness (was Re: Does *anyone* use MVC?)

Tim Rowledge tim at sumeru.stanford.edu
Thu Aug 1 22:51:57 UTC 2002


"Andreas Raab" <Andreas.Raab at 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
-- 
Tim Rowledge, tim at sumeru.stanford.edu, http://sumeru.stanford.edu/tim
I modem, but they grew back.




More information about the Squeak-dev mailing list