Icon rendering perfs comparison between builds 703 and joyride-2230
riccardo
riccardo.lucchese at gmail.com
Wed Aug 6 08:00:12 EDT 2008
Introductory comments for some of these results can be found at:
http://lists.laptop.org/pipermail/devel/2008-July/016820.html.
Please note that logs were redirected to tmpfs during the tests.
Testcase 1:
Paint 25 svg icons on a GtkWindow, 20000 times using cairo; at every
`frame' icons's source surfaces are sequentially picked-up from a list
of 141 cached surfaces (pre-rendered trough libsrvg from some svg [icon]
files from the standard standard joyride installation).
For the test to work properly one has to copy svg files at
http://dev.laptop.org/~rlucchese/icon_rendering/svg/ to dir /opt/svg on
the XO.
HomeWindow.py was hacked to automate its redraw:
http://dev.laptop.org/~rlucchese/icon_rendering/HomeWindow.py
In build 703 the frame wasn't shown during the test:
http://dev.laptop.org/~rlucchese/icon_rendering/patch_0703_framewindow
+ Macro investigation of cpu usage
--- 2230 ---
A picker graph taken during the test can be found at:
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__cached__.picker.svg
(http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__cached__.picker)
The following tab shows cpu usage of the 3 processes that took more cpu
time during the sampling time:
($ grapher -c3 -n -r cpu -i
2230_icon_rendering__switch__cached__.picker)
tot% ps% cmdline
-----------------------
55.2 /usr/bin/X :0 -fp built-ins -wr ...
93.1 37.9 python /usr/bin/sugar-shell
99.2 6.2 picker
--- 703 ---
http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__cached__.picker.svg
(http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__cached__.picker)
($ grapher -c3 -n -r cpu -i
0703_icon_rendering__switch__cached__.picker)
tot% ps% cmdline
-----------------------
52.9 /usr/bin/X :0 -fp built-ins -wr ...
91.4 38.4 python /usr/bin/sugar-shell
100.0 8.6 picker
+ Redraw timings
--- 2230 --
(shell.log snippet at
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__cached__sugar-shell.log)
test duration : ~598.1s
do_expose_event : avg ~0.027s
--- 703 --
(shell.log snippet at
http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__cached__sugar-shell.log)
test duration : ~418.2s
do_expose_event : avg ~0.020s
! test runs slower on build 2230
+ cProfile statistics (KCG format) for sugar-shell:
Not very interesting for this testcase.
http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__cached__sugar-shell.cProfile
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__cached__sugar-shell.cProfile
+ Sysprof statistics:
--- 2230 ---
(http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__cached__.sysprof)
- 32.5% of time spent in xorg goes to a busy loop in the geode driver:
void
gp_wait_until_idle(void)
{
unsigned long temp;
while (((temp = READ_GP32(GP3_BLT_STATUS)) & GP3_BS_BLT_BUSY) ||
!(temp & GP3_BS_CB_EMPTY)) {
;
}
}
- two more functions showing at the top for self time are
dixLookupPrivate and pixman_blt_mmx
--- 703 ---
(http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__cached__.sysprof)
- 53% of time spent in X goes to a busy loop (gp_wait_until_idle) in the
amd driver
- dixLookupPrivate and pixman_blt_mmx aren't present in the results here
(for dixLookupPrivate see
http://lists.freedesktop.org/archives/xorg/2008-July/037233.html)
Time spent in the kernel is almost the same for the two builds.
Looking at the call tree under cairo_paint one can see some bits of
cairo and its xlib backend were refactored since 703, sometimes with
`tiny' (compared to the total) performance loses.
Testcase 2:
Paint 25 svg icons on a GtkWindow 2000 times using cairo; at every
`frame' icons's source surfaces are sequentially picked-up from a list
of 141 svg (icon) files from the standard joyride installation: at every
frame source surfaces are newly rendered from an rsvg handle to the svg
file.
Patches used are those for the previous case with the _TEST_ALWAYSRELOAD
flag set in HomeWindow.py.
+ Macro investigation of cpu usage
--- 2230 ---
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__alwaysreload__.picker.svg
(http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__alwaysreload__.picker)
($ grapher -c3 -n -r cpu -i \
2230_icon_rendering__switch__alwaysreload__.picker)
tot% ps% cmdline
-----------------------
88.1 python /usr/bin/sugar-shell
94.3 6.2 picker
99.6 5.2 /usr/bin/X :0 -fp built-ins -wr ...
--- 703 ---
http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__alwaysreload__.picker.svg
(http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__alwaysreload__.picker)
($ grapher -c3 -n -r cpu -i \
0703_icon_rendering__switch__alwaysreload__.picker)
tot% ps% cmdline
-----------------------
88.0 python /usr/bin/sugar-shell
96.6 8.6 picker
99.9 3.3 /usr/bin/X :0 -fp built-ins -wr ...
+ Redraw timings
`do_expose_event' timings aren't very interesting here because different
svg files take different times to be rendered to a cairo surface
(log snippet at
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__alwaysreload__sugar-shell.log)
(log snippet at
http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__alwaysreload__sugar-shell.log)
2230 test duration : ~535.14s
703 test duration : ~537.4s
+ cProfile statistics (KCG format) for sugar-shell:
Not very interesting for this testcase. Just note that
cairo.Context.paint() is slightly slower (takes more time during the
test) on build 2230.
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__alwaysreload__sugar-shell.cProfile
http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__alwaysreload__sugar-shell.cProfile
+ Sysprof statistics:
Not very interesting for this test case.
(http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__switch__alwaysreload__.sysprof)
(http://dev.laptop.org/~rlucchese/icon_rendering/0703_icon_rendering__switch__alwaysreload__.sysprof)
Testcase 3:
We measure rendering performance when drawing on an hippo.Canvas in
build 2230 (only). This is done by adding 20 `computer-xo' icons to the
friends view and automating the view's redraw.
Patches:
http://dev.laptop.org/~rlucchese/icon_rendering/patch_2230_friendsbox
http://dev.laptop.org/~rlucchese/icon_rendering/patch_2230_friendsbox_test_homewindow
The friends-view was redrawn 10000 times during the test.
+ Macro investigation of cpu usage
--- 2230 ---
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__friendsbox__.picker.svg
(http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__friendsbox__.picker)
($ grapher -c3 -n -r cpu -i \
2230_icon_rendering__friendsbox__.picker.svg)
tot% ps% cmdline
-----------------------
47.9 python /usr/bin/sugar-shell
92.0 44.2 /usr/bin/X :0 -fp built-ins -wr ...
99.7 7.6 picker
+ cProfile statistics (KCG format) for sugar-shell:
--- 2230 ---
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__friendsbox__sugar-shell.cProfile
What we are interested in is the time spent in the function
do_paint_below_children of sugar/graphics/icon.py: 77.5% of its time
goes to cairo.Context.paint() while 14.7% of it goes get_surface (in
class Icon).
Where does get_surface spends its time ?
63.4 __getitem__ of sugar/util.py
7.4 _get_cache_key of sugar/graphics/icon.py
6.5 __contains__ sugar/graphics/util.py
! The LRU is using a dictionary to store entries
I'm not sure of what the LRU does here:
used for animations? for cpu-cache friendliness?
+ sysprof statistics:
--- 2230 ---
http://dev.laptop.org/~rlucchese/icon_rendering/2230_icon_rendering__friendsbox__.sysprof
Comments to sysprof results for testcase #1 are `valid' also here.
Also note that of all the time spent in libhippocanvas because of expose
events only its 22.2% goes to cairo_paint(): python overhead is not
negligible for this task.
thanks,
riccardo
More information about the Devel
mailing list