RESOLVED FIXED 30055
Bad DOM performance in large SVG files
https://bugs.webkit.org/show_bug.cgi?id=30055
Summary Bad DOM performance in large SVG files
Patrick R. Gansterer
Reported 2009-10-04 03:08:50 PDT
When you click on the 1st rect all rects get yellow, on the 2nd they get blue. When you click on the 3rd the first rect gets lime, on the 4th it gets red. Setting only one rect is as slow as setting all rects. In Firefox 3 you see a big difference between setting all or only one rect. With the c-parameter you can change the count of the rects, with the s-parameter the size. Setting only one rect is much faster in http://paroga.com/webkit/rect.php?c=4 than in http://paroga.com/webkit/rect.php?c=10000. In Firefox there is no difference.
Attachments
Paint RenderPath only when necessary (1.34 KB, patch)
2009-10-18 09:10 PDT, Patrick R. Gansterer
eric: review-
commit-queue: commit-queue-
Paint RenderPath only when necessary (1.51 KB, patch)
2009-12-30 05:47 PST, Patrick R. Gansterer
no flags
Bad DOM performance in large SVG files (3.79 KB, patch)
2010-01-10 15:18 PST, Oliver Hunt
no flags
Bad DOM performance in large SVG files (5.53 KB, patch)
2010-01-10 15:19 PST, Oliver Hunt
no flags
Patch (2.98 KB, patch)
2010-01-15 03:49 PST, Oliver Hunt
no flags
Patch (3.58 KB, patch)
2010-01-15 03:51 PST, Oliver Hunt
no flags
Patch (4.21 KB, patch)
2010-01-15 12:48 PST, Oliver Hunt
no flags
Patch (1.96 KB, patch)
2010-01-15 16:04 PST, Oliver Hunt
sam: review+
Patrick R. Gansterer
Comment 1 2009-10-04 13:01:58 PDT
Most of the time ist spent in: RenderLayer::paintLayer RenderSVGRoot::paint It seems that the complete SVG will be rendered every time. I tested it with the Qt port where the dirtyRect is always the size of the whole frame.
Patrick R. Gansterer
Comment 2 2009-10-06 06:28:27 PDT
The same page as html (HTML:div insted of SVG:rect): http://paroga.com/webkit/div.php?c=4 http://paroga.com/webkit/div.php?c=10000 When only setting a single rect (click on rect 3 or 4) the HTML version is much faster. When changing the color of all rects the SVG version is faster.
Eric Seidel (no email)
Comment 3 2009-10-07 12:47:18 PDT
I'm not sure I see the difference. WebKit only seems to be drawing the SVG rects as their added. Using Quartz Debug, I do not see it repainting the whole SVG every time. Bug 14015 is sorta related (drawing too much). I think we need to see a better example to see the performance difference, if there is one. Your example does not convince me that we're drawing too much. However having written the code, I believe you that we're drawing too much. :)
Patrick R. Gansterer
Comment 4 2009-10-07 22:37:11 PDT
(In reply to comment #3) > I'm not sure I see the difference. WebKit only seems to be drawing the SVG > rects as their added. Using Quartz Debug, I do not see it repainting the whole > SVG every time. Have you tried it wit rect.php?c=10000&s=3? Maybay it there to many rects out of the frame, you can't see a difference. It is not the inital rendering, you can see the difference only when click on rect 1, 2, 3 or 4. I think that the dirtyRegion is calculatet correctly, but nothing cares about it (at least in the Qt port)
Eric Seidel (no email)
Comment 5 2009-10-08 13:23:54 PDT
OK, so clicking is important, yes. I didn't realize I had to click on them. I tried these just now in Safari 4.0.3 and SVG was correctly redrawing only one svg rect when toggling the color on one rect. If Qt is re-drawing the whole page, that seems like a qt bug. I did not try on tip of tree, but I kinda doubt this regressed... but maybe it did.
Patrick R. Gansterer
Comment 6 2009-10-08 13:44:40 PDT
(In reply to comment #5) 1) open http://paroga.com/webkit/rect.php?c=4&s=3 2) click on the 1st rect and stop the time until the first rect changes its color 3) click on the 3rd rect and stop the time until the first rect changes its color 4) open http://paroga.com/webkit/rect.php?c=10000&s=3 5) click on the 1st rect and stop the time until the first rect changes its color 6) click on the 3rd rect and stop the time until the first rect changes its color 7) time in step 6 is much bigger than in step 3 Both times should be the same, because only one rect changes it's color. When time in step 2 is much bigger than in step 5 this is ok, because in the second page are much more items to be redrawn. You can see the expected result when you open the page with Firefox.
Patrick R. Gansterer
Comment 7 2009-10-18 09:10:27 PDT
Created attachment 41379 [details] Paint RenderPath only when necessary With this path clicking on the 3rd or 4th rect in http://paroga.com/webkit/rect.php?c=10000&s=3 is about 4 times faster on my computer. (time from click event until the first rect changes it's color) I'm not sure if this is the right place for my changes.
Eric Seidel (no email)
Comment 8 2009-10-20 23:17:48 PDT
This looks great! I'd like to test the patch myself first before I r+ this though.
Oliver Hunt
Comment 9 2009-10-28 12:52:31 PDT
Comment on attachment 41379 [details] Paint RenderPath only when necessary Why are you checking for intersection prior to applying the local transform to the paintInfo region?
Patrick R. Gansterer
Comment 10 2009-10-28 13:40:14 PDT
(In reply to comment #9) > Why are you checking for intersection prior to applying the local transform to > the paintInfo region? I only tried to find an easy way to demonstate the performance problem. The paintInfo.context->save(); stuff takes a significant amount of time on my machine. In my optinion there must be a better way to handle "DOM repaints" in general. Always iterateing over _all_ items isn't very cool. Maybe you can confirm this issue and tell me the prefered solution. If you take a look at http://paroga.com/webkit/livedemo.php you can see a (not so good) example what people do with SVG.
Eric Seidel (no email)
Comment 11 2009-10-28 14:49:24 PDT
This patch is exactly the right idea. I just need to confirm that it's implemented correctly. I need to make space in my schedule to test your patch locally and check to see if other if statements like this one should be added to SVG renderers.
Eric Seidel (no email)
Comment 12 2009-10-29 15:56:25 PDT
Ok, I'm not able to reproduce the slowness you mention about clicking on the 3rd or 4th rect in http://paroga.com/webkit/rect.php?c=10000&s=3. That example is actually really poor, because it requires someone to know that they're supposed to click on a special rect to demonstrate the bug. Much better would be a self-documenting page with buttons one could click on which say what they do. I agree we should probably make a change like this. I just don't think we've justified it very well up until now. The pathalogical case that you're trying to demonstrate is a single group containing a large number of path objects (<rect>, etc) where only one of them changes. In current SVG code, all of them will be asked to paint and then the results will be clipped out. It appears that the clipping is rather cheap in CoreGraphics, but whatever platform you are using is slower.
Patrick R. Gansterer
Comment 13 2009-10-30 01:00:14 PDT
(In reply to comment #12) > That example is actually really poor, because it requires someone to know that > they're supposed to click on a special rect to demonstrate the bug. Much > better would be a self-documenting page with buttons one could click on which > say what they do. I've improved the example.
Patrick R. Gansterer
Comment 14 2009-10-30 12:45:26 PDT
(In reply to comment #12) > Ok, I'm not able to reproduce the slowness you mention about clicking on the > 3rd or 4th rect in http://paroga.com/webkit/rect.php?c=10000&s=3. I can't believe you! ;-) I now compiled r50334 with the Qt-port (4.6 beta) on windows and tested the following patch (with g_checkIntersect true and false): > if (paintInfo.context->paintingDisabled() || style()->visibility() ...) > return; > > + FloatRect boundingBox = repaintRectInLocalCoordinates(); > + if (g_checkIntersect && !boundingBox.intersects(paintInfo.rect)) > + return; > + > paintInfo.context->save(); > paintInfo.context->concatCTM(localToParentTransform()); > > SVGResourceFilter* filter = 0; > > - FloatRect boundingBox = repaintRectInLocalCoordinates(); > if (paintInfo.phase == PaintPhaseForeground) { > PaintInfo savedInfo(paintInfo); When I open http://paroga.com/webkit/rect.php?c=80000&s=3 with g_checkIntersect = true it takes about 2 seconds to change the color of the first element. With g_checkIntersect = false the same action takes about 10 seconds on my machine. Maybe the rendering/clipping isn't as time-consuming with your port? Is it possible that you try it with the Qt-port? When i apply this patch to WebCore it can't be a Qt-specific rendering problem?!?
Oliver Hunt
Comment 15 2009-11-09 14:19:36 PST
> Maybe the rendering/clipping isn't as time-consuming with your port? Is it > possible that you try it with the Qt-port? When i apply this patch to WebCore > it can't be a Qt-specific rendering problem?!? WebCore uses the platform's graphics library, if that graphics library has bad perf in some cases it can easily cause all sorts of badness. I'm unsure whether the solution should be to get Qt to fix this issue (presumably it's a problem in their graphics library) or fix it in WebCore itself (which may negatively impact performance of other platforms) Maybe this logic should be in GrpahicsContextQt?
Patrick R. Gansterer
Comment 16 2009-11-10 01:01:12 PST
(In reply to comment #15) > WebCore uses the platform's graphics library, if that graphics library has bad > perf in some cases it can easily cause all sorts of badness. I'm unsure > whether the solution should be to get Qt to fix this issue (presumably it's a > problem in their graphics library) or fix it in WebCore itself (which may > negatively impact performance of other platforms) > > Maybe this logic should be in GrpahicsContextQt? Do you think rendering anything ist better than checking if it is necessary? I think WebCore should render as least as possible. In GrpahicsContextQt there won't be any information to check if painting is required. Rely on a "perfect performing" graphics library isn't the right way in opinion. There might be some other ports with slow graphics librarys too.
Oliver Hunt
Comment 17 2009-11-15 15:01:06 PST
(In reply to comment #16) > (In reply to comment #15) > > WebCore uses the platform's graphics library, if that graphics library has bad > > perf in some cases it can easily cause all sorts of badness. I'm unsure > > whether the solution should be to get Qt to fix this issue (presumably it's a > > problem in their graphics library) or fix it in WebCore itself (which may > > negatively impact performance of other platforms) > > > > Maybe this logic should be in GrpahicsContextQt? > Do you think rendering anything ist better than checking if it is necessary? I > think WebCore should render as least as possible. In GrpahicsContextQt there > won't be any information to check if painting is required. Rely on a "perfect > performing" graphics library isn't the right way in opinion. There might be > some other ports with slow graphics librarys too. The problem is that if the underlying graphics library is already doing the tests it may have a more efficient way of doing so, add to that the fact that the underlying graphics libraries that do perform sensible clipping optimisations will still be doing their own clip tests this seems like a patch that has bad perf impact on good libraries to deal with poor performance in others. I suspect if we really do want webcore to work around what is arguably a perf bug in Qts graphics subsystem the fix should be placed in GraphicsContextQt directly
Eric Seidel (no email)
Comment 18 2009-11-15 18:32:46 PST
I think we can use both approaches, and I think that this approach has some usefulness. It needs to be well tested though. I also agree with Oliver, that if Qt is not properly ignoring drawing commands which are issued outside of the clip region, than that seems like a major bug in Qt.
Patrick R. Gansterer
Comment 19 2009-11-15 18:48:26 PST
(In reply to comment #17) > The problem is that if the underlying graphics library is already doing the > tests it may have a more efficient way of doing so, add to that the fact that > the underlying graphics libraries that do perform sensible clipping > optimisations will still be doing their own clip tests this seems like a patch > that has bad perf impact on good libraries to deal with poor performance in > others. So this patch has to move to a higher level where "more intelligent" test can be done and the clipping should be fixed in GraphicsContextQt directly. However the following test is much slower(!) in Safari/Chrome than in FF: Click on "Set first lime/red" at http://paroga.com/webkit/rect.php?c=80000&s=2 On my machine: FF ~150ms, Opera ~300ms, Chrome ~2s, Safari ~10s How to get the same performance of FF/Opera in WebCore? Any suggestions?
Adam Barth
Comment 20 2009-11-30 12:17:58 PST
Attachment 41379 [details] passed the style-queue
Oliver Hunt
Comment 21 2009-12-10 10:22:12 PST
(In reply to comment #19) > (In reply to comment #17) > > The problem is that if the underlying graphics library is already doing the > > tests it may have a more efficient way of doing so, add to that the fact that > > the underlying graphics libraries that do perform sensible clipping > > optimisations will still be doing their own clip tests this seems like a patch > > that has bad perf impact on good libraries to deal with poor performance in > > others. > So this patch has to move to a higher level where "more intelligent" test can > be done and the clipping should be fixed in GraphicsContextQt directly. > > However the following test is much slower(!) in Safari/Chrome than in FF: > Click on "Set first lime/red" at http://paroga.com/webkit/rect.php?c=80000&s=2 > On my machine: FF ~150ms, Opera ~300ms, Chrome ~2s, Safari ~10s > > How to get the same performance of FF/Opera in WebCore? Any suggestions? I don't see this 10s delay you're referring to what platform are you testing on?
Patrick R. Gansterer
Comment 22 2009-12-10 11:12:14 PST
(In reply to comment #21) > I don't see this 10s delay you're referring to what platform are you testing > on? Safari 4.0.4, Windows XP SP3, IBM T60 2GHz, 3GB
Oliver Hunt
Comment 23 2009-12-12 23:22:35 PST
Comment on attachment 41379 [details] Paint RenderPath only when necessary I found another testcase where we get pathologically bad perf due to this issue which would imply that there's just too much cost in not clipping prior to calling the graphics library -- my test case just created many many many (~50000 odd) nodes mostly off the screen and this patch represents a huge improvement in that case. Still not sure why i don't see the perf problems you do in your example, but with a testcase that is too slow this shows up as a clear problem in shark. r=me. The patch applies cleanly lets see how the commit bot deals with the changelog.
WebKit Commit Bot
Comment 24 2009-12-13 01:14:20 PST
Comment on attachment 41379 [details] Paint RenderPath only when necessary Rejecting patch 41379 from commit-queue. Failed to run "['WebKitTools/Scripts/run-webkit-tests', '--no-launch-safari', '--exit-after-n-failures=1', '--quiet']" exit_code: 1 Running build-dumprendertree Running tests from /Users/eseidel/Projects/CommitQueue/LayoutTests Testing 11771 test cases. svg/batik/filters/filterRegions.svg -> failed Exiting early after 1 failures. 10019 tests run. 313.92s total testing time 10018 test cases (99%) succeeded 1 test case (<1%) had incorrect layout 6 test cases (<1%) had stderr output
Dirk Schulze
Comment 25 2009-12-13 01:23:31 PST
(In reply to comment #23) > (From update of attachment 41379 [details]) > I found another testcase where we get pathologically bad perf due to this issue > which would imply that there's just too much cost in not clipping prior to > calling the graphics library -- my test case just created many many many > (~50000 odd) nodes mostly off the screen and this patch represents a huge > improvement in that case. offscreen: It depends. If the SVG size is also bigger than the screensize, we shouldn't clip to the currently visible area. smfr remind me, that we can include a SVG into a HTML-file and make some 3D transformations (via CSS3) with it. That might not work correctly, if the SVG is clipped.
Oliver Hunt
Comment 26 2009-12-13 12:59:51 PST
(In reply to comment #25) > (In reply to comment #23) > > (From update of attachment 41379 [details] [details]) > > I found another testcase where we get pathologically bad perf due to this issue > > which would imply that there's just too much cost in not clipping prior to > > calling the graphics library -- my test case just created many many many > > (~50000 odd) nodes mostly off the screen and this patch represents a huge > > improvement in that case. > > offscreen: > It depends. If the SVG size is also bigger than the screensize, we shouldn't > clip to the currently visible area. smfr remind me, that we can include a SVG > into a HTML-file and make some 3D transformations (via CSS3) with it. That > might not work correctly, if the SVG is clipped. We should simply be clipping to the region that is going to actually be drawn to, assuming everything is working correctly that is correct -- if i can apply a 3d transform and that will result in incorrect clipping area then thats a serious bug in the 3d transform paths
Eric Seidel (no email)
Comment 27 2009-12-20 19:07:05 PST
Curious what the status of this patch is? Should this be r-'d now that we know that this patch will at least cause one layout test to fail?
Eric Seidel (no email)
Comment 28 2009-12-28 22:16:01 PST
Comment on attachment 41379 [details] Paint RenderPath only when necessary Marking r- since this causes a test to fail.
Eric Seidel (no email)
Comment 29 2009-12-28 22:16:39 PST
Also the second OOPS in the ChangeLog would have caused the commit to fail. ChangeLogs should mention tests affected by a change.
Patrick R. Gansterer
Comment 30 2009-12-29 08:26:04 PST
(In reply to comment #28) > (From update of attachment 41379 [details]) > Marking r- since this causes a test to fail. The problem is that an other area of Webkit does something wrong. This patch is ok, but i depends on an "not created bug". Can we create a new bug, make the patch depend on in r+ it again? Who is responsible for the code tested with filterRegions.svg? Maybe he can make a change there to get this patch in?
Eric Seidel (no email)
Comment 31 2009-12-29 09:19:56 PST
Yes, if we're waiting to commit this because a problem exists that we've never actually created a bug for, then definitely we should create a bug. :) Getting an r+ is relatively easy. Especially since this patch already had one. But if we can't land it due to another bug, we should file the other bug and mark this one blocked.
Dirk Schulze
Comment 32 2009-12-29 23:52:58 PST
Can we move this fix to SVGRenderBase::prepareToRenderSVGContent?? This would stop rendering earlier and can improve the rendering time on other parts like images too.
Patrick R. Gansterer
Comment 33 2009-12-30 02:19:59 PST
(In reply to comment #31) > Yes, if we're waiting to commit this because a problem exists that we've never > actually created a bug for, then definitely we should create a bug. :) Can we r+ and cq+ it again since bug 32815 is fixed now? (In reply to comment #32) > Can we move this fix to SVGRenderBase::prepareToRenderSVGContent?? > > This would stop rendering earlier and can improve the rendering time on other > parts like images too. I think we should commit this change and maybe another too. This patch is not in the SVG part so it might improve also some other parts.
Dirk Schulze
Comment 34 2009-12-30 03:12:06 PST
> (In reply to comment #32) > (In reply to comment #32) > > Can we move this fix to SVGRenderBase::prepareToRenderSVGContent?? > > > > This would stop rendering earlier and can improve the rendering time on other > > parts like images too. > I think we should commit this change and maybe another too. This patch is not > in the SVG part so it might improve also some other parts. RenderPath is SVG only.
Patrick R. Gansterer
Comment 35 2009-12-30 03:57:10 PST
(In reply to comment #34) > RenderPath is SVG only. I meant that maybe another componet will use RenderPath in the future, but thats not a real reason. Moving it to prepareToRenderSVGContent won't prevent _unnecessary_ paintInfo.context->save(), concatCTM(...), restore() and so on. It should be done as early as possible! Iterating over _all_ items, even if only one pixel changed, is already not very performant. (checking which items need a repaint might be even more cpu consuming)
Dirk Schulze
Comment 36 2009-12-30 04:22:13 PST
(In reply to comment #35) > (In reply to comment #34) > > RenderPath is SVG only. > I meant that maybe another componet will use RenderPath in the future, but > thats not a real reason. > > Moving it to prepareToRenderSVGContent won't prevent _unnecessary_ > paintInfo.context->save(), concatCTM(...), restore() and so on. > It should be done as early as possible! Iterating over _all_ items, even if > only one pixel changed, is already not very performant. (checking which items > need a repaint might be even more cpu consuming) Can you please upload a new patch with a link to the bugreport Changelog and the title of the bug? There shouldn't be Oops'es in a Changelog. Please write why it is not possible to test the speed improvement and I think we can commit it.
Patrick R. Gansterer
Comment 37 2009-12-30 05:47:41 PST
Created attachment 45658 [details] Paint RenderPath only when necessary
WebKit Review Bot
Comment 38 2009-12-30 05:49:17 PST
style-queue ran check-webkit-style on attachment 45658 [details] without any errors.
Dirk Schulze
Comment 39 2009-12-30 08:01:52 PST
Comment on attachment 45658 [details] Paint RenderPath only when necessary LGTM. Thanks for the patch.
WebKit Commit Bot
Comment 40 2009-12-30 08:10:48 PST
Comment on attachment 45658 [details] Paint RenderPath only when necessary Rejecting patch 45658 from commit-queue. Failed to run "['WebKitTools/Scripts/run-webkit-tests', '--no-launch-safari', '--exit-after-n-failures=1', '--quiet']" exit_code: 1 Running build-dumprendertree Running tests from /Users/eseidel/Projects/CommitQueueSVN/LayoutTests Testing 11854 test cases. svg/custom/marker-overflow-clip.svg -> failed Exiting early after 1 failures. 10306 tests run. 313.90s total testing time 10305 test cases (99%) succeeded 1 test case (<1%) had incorrect layout 7 test cases (<1%) had stderr output Full output: http://webkit-commit-queue.appspot.com/results/152351
Dirk Schulze
Comment 41 2009-12-30 08:56:48 PST
(In reply to comment #40) > (From update of attachment 45658 [details]) > Rejecting patch 45658 from commit-queue. > > Failed to run "['WebKitTools/Scripts/run-webkit-tests', '--no-launch-safari', > '--exit-after-n-failures=1', '--quiet']" exit_code: 1 > Running build-dumprendertree > Running tests from /Users/eseidel/Projects/CommitQueueSVN/LayoutTests > Testing 11854 test cases. > svg/custom/marker-overflow-clip.svg -> failed > > Exiting early after 1 failures. 10306 tests run. > 313.90s total testing time > > 10305 test cases (99%) succeeded > 1 test case (<1%) had incorrect layout > 7 test cases (<1%) had stderr output > > Full output: http://webkit-commit-queue.appspot.com/results/152351 Ahhh sorry. There is another bug about markers and boundingBoxes: bug 33012 . Without knowing the actual result with your patch, I guess that this fixes the problem.
Eric Seidel (no email)
Comment 42 2010-01-03 18:46:18 PST
Comment on attachment 45658 [details] Paint RenderPath only when necessary Marking r- since this seems to cause a test to fail? Correct me if I'm wrong Dirk.
Dirk Schulze
Comment 43 2010-01-03 23:58:23 PST
(In reply to comment #42) > (From update of attachment 45658 [details]) > Marking r- since this seems to cause a test to fail? Correct me if I'm wrong > Dirk. No, the patch is ok. It just depends on anotherone. I'll commot-queue+ the patch again, once Niko fixed the marker bug.
Dirk Schulze
Comment 44 2010-01-06 15:33:07 PST
Comment on attachment 45658 [details] Paint RenderPath only when necessary Markers and repaintRects are fixed. Lets try it again.
WebKit Commit Bot
Comment 45 2010-01-06 21:30:37 PST
Comment on attachment 45658 [details] Paint RenderPath only when necessary Clearing flags on attachment: 45658 Committed r52900: <http://trac.webkit.org/changeset/52900>
WebKit Commit Bot
Comment 46 2010-01-06 21:30:50 PST
All reviewed patches have been landed. Closing bug.
Eric Seidel (no email)
Comment 47 2010-01-06 21:34:53 PST
Comment on attachment 45658 [details] Paint RenderPath only when necessary This type of fix would be more interesting to apply to the hit-testing code path. But this fix should be fine. Thanks for the patch Patrick and the review Dirk!
Dimitri Glazkov (Google)
Comment 48 2010-01-07 09:53:32 PST
This change broke a bunch of SVG tests, all pixel results. For illustration, visit this at ToT: http://trac.webkit.org/export/52929/trunk/LayoutTests/fast/backgrounds/size/contain-and-cover.html I think we should roll this change out.
Dimitri Glazkov (Google)
Comment 49 2010-01-07 10:09:13 PST
Dirk Schulze
Comment 50 2010-01-07 10:23:32 PST
(In reply to comment #48) > This change broke a bunch of SVG tests, all pixel results. For illustration, > visit this at ToT: > http://trac.webkit.org/export/52929/trunk/LayoutTests/fast/backgrounds/size/contain-and-cover.html > > I think we should roll this change out. A problem of transparent and half transparent parts of some objects?
Oliver Hunt
Comment 51 2010-01-10 15:18:39 PST
Created attachment 46243 [details] Bad DOM performance in large SVG files
Oliver Hunt
Comment 52 2010-01-10 15:19:10 PST
Created attachment 46244 [details] Bad DOM performance in large SVG files
Nikolas Zimmermann
Comment 53 2010-01-10 17:02:31 PST
Comment on attachment 46243 [details] Bad DOM performance in large SVG files LGTM, I assume there are no pixel test regressions, r+.
Nikolas Zimmermann
Comment 54 2010-01-10 17:03:27 PST
Comment on attachment 46244 [details] Bad DOM performance in large SVG files Interessting that CGPathIsEmpty is that slow... I assume you see a good benefit, so r=me.
Oliver Hunt
Comment 55 2010-01-10 19:05:16 PST
First patch landed in r53057. I'm actually slightly uneasy about landing the isempty caching so i'm going to see if there's something that can be done to get a bigger win. That said i think that this patch should resolve all of the perf issues in the main testcase attached to this patch.
Dimitri Glazkov (Google)
Comment 56 2010-01-10 21:03:50 PST
Sorry guys, still no luck on pixel tests. Running "run-webkit-tests --pixel-tests svg" produces: Enabling pixel tests with a tolerance of 0.1% WARNING: Temporarily changing the main display color profile: The colors on your screen will change for the duration of the testing. This allows the pixel tests to have consistent color values across all machines. Testing 945 test cases. svg/W3C-SVG-1.1 ....................................................................... svg/W3C-SVG-1.1/coords-units-01-b.svg -> pixel test failed ......... svg/W3C-SVG-1.1/filters-composite-02-b.svg -> pixel test failed .......................................... svg/W3C-SVG-1.1/masking-intro-01-f.svg -> pixel test failed . svg/W3C-SVG-1.1/masking-mask-01-b.svg -> pixel test failed ...................................... svg/W3C-SVG-1.1/pservers-grad-03-b.svg -> pixel test failed ... svg/W3C-SVG-1.1/pservers-grad-06-b.svg -> pixel test failed ....... svg/W3C-SVG-1.1/pservers-grad-13-b.svg -> pixel hash failed (but pixel test still passes) .... svg/W3C-SVG-1.1/pservers-grad-17-b.svg -> pixel hash failed (but pixel test still passes) ... svg/W3C-SVG-1.1/pservers-pattern-01-b.svg -> pixel test failed ....................................................................... svg/W3C-SVG-1.1/text-deco-01-b.svg -> pixel hash failed (but pixel test still passes) .... svg/W3C-SVG-1.1/text-path-01-b.svg -> pixel hash failed (but pixel test still passes) ... svg/W3C-SVG-1.1/text-text-03-b.svg -> pixel hash failed (but pixel test still passes) .... svg/W3C-SVG-1.1/text-text-07-t.svg -> pixel hash failed (but pixel test still passes) ........ svg/animations . svg/batik/filters .. svg/batik/masking . svg/batik/masking/maskRegions.svg -> pixel test failed svg/batik/paints .. svg/batik/paints/patternPreserveAspectRatioA.svg -> pixel test failed . svg/batik/paints/patternRegionA.svg -> pixel test failed . svg/batik/paints/patternRegions.svg -> pixel test failed svg/batik/text ..... svg/batik/text/textDecoration2.svg -> pixel hash failed (but pixel test still passes) .. svg/batik/text/textEffect3.svg -> pixel hash failed (but pixel test still passes) .. svg/batik/text/textFeatures.svg -> pixel hash failed (but pixel test still passes) . svg/batik/text/textGlyphOrientationHorizontal.svg -> pixel hash failed (but pixel test still passes) ....... svg/batik/text/textOnPathSpaces.svg -> pixel hash failed (but pixel test still passes) ..... svg/batik/text/textProperties.svg -> pixel hash failed (but pixel test still passes) . svg/batik/text/textStyles.svg -> pixel hash failed (but pixel test still passes) . svg/batik/text/verticalText.svg -> pixel hash failed (but pixel test still passes) . svg/batik/text/verticalTextOnPath.svg -> pixel hash failed (but pixel test still passes) . svg/carto.net .......... svg/css . svg/css/arrow-with-shadow.svg -> pixel hash failed (but pixel test still passes) . svg/css/circle-in-mask-with-shadow.svg -> pixel test failed .. svg/css/composite-shadow-example.html -> pixel hash failed (but pixel test still passes) . svg/css/composite-shadow-with-opacity.html -> pixel hash failed (but pixel test still passes) .... svg/css/group-with-shadow.svg -> pixel hash failed (but pixel test still passes) . svg/css/mask-with-shadow.svg -> pixel test failed . svg/css/path-with-shadow.svg -> pixel hash failed (but pixel test still passes) . svg/css/stars-with-shadow.html -> pixel hash failed (but pixel test still passes) svg/custom ....................................... svg/custom/deep-dynamic-updates.svg -> pixel test failed ................................................... svg/custom/grayscale-gradient-mask.svg -> pixel test failed ............ svg/custom/image-with-transform-clip-filter.svg -> pixel hash failed (but pixel test still passes) ................. svg/custom/js-late-mask-and-object-creation.svg -> pixel test failed . svg/custom/js-late-mask-creation.svg -> pixel test failed . svg/custom/js-late-pattern-and-object-creation.svg -> pixel test failed . svg/custom/js-late-pattern-creation.svg -> pixel test failed ............ svg/custom/js-update-pattern-child.svg -> pixel test failed . svg/custom/js-update-pattern.svg -> pixel test failed ....................... svg/custom/marker-changes.svg -> pixel hash failed (but pixel test still passes) . svg/custom/marker-child-changes.svg -> pixel hash failed (but pixel test still passes) ...... svg/custom/marker-strokeWidth-changes.svg -> pixel hash failed (but pixel test still passes) .. svg/custom/mask-changes.svg -> pixel test failed . svg/custom/mask-child-changes.svg -> pixel test failed . svg/custom/mask-excessive-malloc.svg -> pixel test failed . svg/custom/mask-inside-defs.svg -> pixel test failed . svg/custom/mask-on-multiple-objects.svg -> pixel test failed . svg/custom/mask-with-all-units.svg -> pixel test failed .............. svg/custom/pattern-cycle-detection.svg -> pixel test failed . svg/custom/pattern-deep-referencing.svg -> pixel test failed . svg/custom/pattern-in-defs.svg -> pixel test failed . svg/custom/pattern-rotate.svg -> pixel test failed . svg/custom/pattern-with-transformation.svg -> pixel test failed . svg/custom/pattern-y-offset.svg -> pixel test failed ............... svg/custom/radial-gradient-with-outstanding-focalPoint.svg -> pixel test failed .... svg/custom/resource-invalidate-on-target-update.svg -> pixel test failed ................ svg/custom/stroked-pattern.svg -> pixel test failed ........................................................................... svg/custom/use-on-symbol-inside-pattern.svg -> pixel test failed ......................... svg/custom/visibility-override-mask.svg -> pixel test failed .... svg/dom ......................... svg/dom/SVGRectElement . svg/dom/SVGScriptElement .... svg/dom/SVGStyleElement . svg/dynamic-updates ................................................................................................................................ svg/filters .......... svg/filters/filter-clip.svg -> pixel test failed ........ svg/hittest .. svg/hixie/cascade .. svg/hixie/data-types .. svg/hixie/dynamic ...... svg/hixie/error .................. svg/hixie/links ... svg/hixie/mixed ......... svg/hixie/painting . svg/hixie/perf ..... svg/hixie/processing-model ... svg/hixie/rendering-model ..... svg/hixie/shapes/path . svg/hixie/text ..... svg/hixie/transform . svg/hixie/use ... svg/hixie/viewbox .... svg/hixie/viewbox/preserveAspectRatio .. svg/text .... svg/text/selection-background-color.xhtml -> pixel hash failed (but pixel test still passes) .... svg/text/text-align-04-b.svg -> pixel hash failed (but pixel test still passes) .... svg/text/text-deco-01-b.svg -> pixel hash failed (but pixel test still passes) ....... svg/text/text-path-01-b.svg -> pixel hash failed (but pixel test still passes) .... svg/text/text-text-01-b.svg -> pixel hash failed (but pixel test still passes) . svg/text/text-text-03-b.svg -> pixel hash failed (but pixel test still passes) . svg/text/text-text-04-t.svg -> pixel hash failed (but pixel test still passes) ... svg/text/text-text-07-t.svg -> pixel hash failed (but pixel test still passes) . svg/text/text-text-08-b.svg -> pixel hash failed (but pixel test still passes) ....... svg/transforms .. svg/transforms/text-with-pattern-inside-transformed-html.xhtml -> pixel test failed . svg/transforms/text-with-pattern-with-svg-transform.svg -> pixel test failed svg/webarchive ... 72.68s total testing time 904 test cases (95%) succeeded 41 test cases (4%) had incorrect layout 1 test case (<1%) had stderr output
Dimitri Glazkov (Google)
Comment 58 2010-01-10 21:22:09 PST
Just to make sure, with the patch rolled out locally, same command produces: 944 test cases (99%) succeeded 1 test case (<1%) had incorrect layout 1 test case (<1%) had stderr output
Nikolas Zimmermann
Comment 59 2010-01-11 02:42:42 PST
Comment on attachment 46243 [details] Bad DOM performance in large SVG files Clearing review flag, this patch needs to be revisited. Anyone who works on this has to be aware that regressions can only be spotted when running _PIXEL TESTS_.
Nikolas Zimmermann
Comment 60 2010-01-11 02:43:00 PST
Comment on attachment 46244 [details] Bad DOM performance in large SVG files Taking back review, as discussed with Oliver.
Oliver Hunt
Comment 61 2010-01-15 03:49:24 PST
Oliver Hunt
Comment 62 2010-01-15 03:51:56 PST
Nikolas Zimmermann
Comment 63 2010-01-15 04:19:41 PST
Comment on attachment 46668 [details] Patch Okay, let's hope it fixes it this time... Can you file a follow-up bug regarding PaintInfo fixes is renderSubtreeToImage?
Oliver Hunt
Comment 64 2010-01-15 04:25:40 PST
Dimitri Glazkov (Google)
Comment 65 2010-01-15 09:21:33 PST
Darnit! One test still broke: http://trac.webkit.org/browser/trunk/LayoutTests/fast/borders/svg-as-border-image-2.html Can you take a look and see what's happening there?
Dimitri Glazkov (Google)
Comment 66 2010-01-15 09:48:27 PST
Rolled out Oliver's patch in http://trac.webkit.org/changeset/53334, per IRC discussion w/Nikolas. But you're really, really close now! Don't give up!
Oliver Hunt
Comment 67 2010-01-15 12:48:23 PST
Oliver Hunt
Comment 68 2010-01-15 12:54:47 PST
Oliver Hunt
Comment 69 2010-01-15 16:04:23 PST
Oliver Hunt
Comment 70 2010-01-15 16:05:44 PST
Just opening for a improvement to culling
Sam Weinig
Comment 71 2010-01-15 16:14:56 PST
Comment on attachment 46715 [details] Patch Please add more complete explanation to the ChangeLog. r=me
Oliver Hunt
Comment 72 2010-01-15 16:16:35 PST
Note You need to log in before you can comment on or make changes to this bug.