From 8495e0507e336f0e0a01746ecf0b4cf90356583a Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Wed, 20 Jun 2007 02:02:59 -0700 Subject: [PATCH] Add mozilla_trender blog entry --- src/exa/mozilla_trender.mdwn | 81 +++++++++++++++++++++++++++++++ src/exa/mozilla_trender/i965.png | Bin 0 -> 10373 bytes src/exa/mozilla_trender/r100.png | Bin 0 -> 10111 bytes 3 files changed, 81 insertions(+) create mode 100644 src/exa/mozilla_trender.mdwn create mode 100644 src/exa/mozilla_trender/i965.png create mode 100644 src/exa/mozilla_trender/r100.png diff --git a/src/exa/mozilla_trender.mdwn b/src/exa/mozilla_trender.mdwn new file mode 100644 index 0000000..2cc8505 --- /dev/null +++ b/src/exa/mozilla_trender.mdwn @@ -0,0 +1,81 @@ +[[meta title="Real-world tests: Mozilla Trender"]] + +[[tag exa performance xorg]] + +In +[earlier](http://article.gmane.org/gmane.comp.freedesktop.xorg/17466) +[[efforts|understanding_rectangles]] I've been comparing the +performance of the EXA acceleration architecture to the older XAA +architecture as well as to having no acceleration enabled in the X +server at all. + +Some of the results I found were startling and discouraging, (with EXA +performing several times slower than even NoAccel in some cases). As I +[[drilled|corrected_rectangles]] [[further|mystery_solved]] one +obvious question arose: Was I seeing significant performance problems +that would affect real-world cases? Or was it just that the synthetic, +micro benchmarks in cairo's performance test suite happened to +exercise corner cases that wouldn't cause problems in practice. + +So before going further with those results, I decided to step back and +measure some real-world loads with and without EXA. Thanks to some +help from Robert and Vladimir I was able to get Mozilla's +[Trender](http://wiki.mozilla.org/Mozilla2:Trender) benchmark up and +running. And thanks to Keith Packard of Intel, I'm now testing on an +Intel 965 chip in addition to the old ATI r100 in my laptop that I was +using before. + +The Trender benchmark measures rendering time for many different +real-world web pages, SVG files, and some synthetic loads. Mean times +are reported for several different subsets of the tests as well as one +mean time over all the tests. + +All the details and charts are below, but I'll deliver the punchline +here. For the Mozilla Trender benchmark, EXA is almost always a +slowdown compared to NoAccel, (for either i965 or r100). And for the +i965, XAA is also always a slowdown, and a dramatic slowdown for the +SVG case, (which is gearflowers.svg). Interestingly, the SVG case on +the i965 is also the one case where EXA is able to match the NoAccel +performance. + +I haven't tracked the cause of these slowdowns down yet---stay tuned +for that---and it's possible that mozilla could perhaps be doing +something different to help. But more and more it looks like there are +some basic things missing in EXA. Again, hopefully this means there's +some low-hanging fruit here that will be easy to optimize. + +Here are the configuration details and results for the Intel 965: + + * xserver: [0375009a][] (May 17 commit) + * xf86-video-ati: [aea801cf][] (Apr. 13 commit) + * firefox: 3.0a6pre (June 17 [nightly build][]) + +[[i965.png]] + + +
Test Tbox TboxGFX English Foreign SVG ALL +
NoAccel 21.859 44.698 12.110 41.205 474.750 24.176 +
XAA 28.458 221.035 18.144 43.614 1075.306 32.997 +
EXA 100.777 133.532 83.543 101.258 473.111 87.740 +
+ +And here is the same for the r100: + + * xserver: [3c982bc1][] (May 24 commit) + * xf86-video-intel: [d1723445][] (May 23 commit) + * firefox: 3.0a6pre (June 17 [nightly build][]) + +[[r100.png]] + + +
Test Tbox TboxGFX English Foreign SVG ALL +
NoAccel 68.891 46.772 49.668 71.574 1126.222 55.282 +
XAA 55.757 43.344 38.190 60.322 1137.000 45.493 +
EXA 141.928 99.445 125.808 143.801 1761.917 120.152 +
+ + [0375009a]: http://cgit.freedesktop.org/xorg/xserver.git/commit/?id=0375009a + [aea801cf]: http://cgit.freedesktop.org/xorg/driver/xf86-video-ati.git/commit/?id=aea801cf + [3c982bc1]: http://cgit.freedesktop.org/xorg/xserver.git/commit/?id=3c982bc1 + [d1723445]: http://cgit.freedesktop.org/xorg/driver/xf86-video-intel.git/commit/?id=d1723445 + [nightly build]: http://ftp.mozilla.org/pub/mozilla.org/firefox/nightly/latest-trunk/) diff --git a/src/exa/mozilla_trender/i965.png b/src/exa/mozilla_trender/i965.png new file mode 100644 index 0000000000000000000000000000000000000000..35b9dc8848cedf7aab1306482732d092bfb8a31f GIT binary patch literal 10373 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 literal 0 HcmV?d00001 diff --git a/src/exa/mozilla_trender/r100.png b/src/exa/mozilla_trender/r100.png new file mode 100644 index 0000000000000000000000000000000000000000..45747ea3e6bacc28671ef825344f9764231201fd GIT binary patch literal 10111 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