Do we understand what's causing the performance regression?  For
example, there are other implementation approaches where we try to
transfer the last ref rather than churning it or where we could use a
free list rather than a vector.  I just wonder if there's a way to get
the benefits with a lower cost.

Adam


On Thu, Mar 1, 2012 at 4:50 PM, Ojan Vafai <[email protected]> wrote:
> We have a lot of code (e.g. in ContainerNode.cpp or any of the editing code)
> that needs to RefPtr nodes to make sure they're not destroyed due to
> synchronous events like blur, mutation events, etc. For example,
> ContainerNode::removeChild needs to RefPtr the parent to make it's not
> destroyed during a sync event.
>
> Currently, we need to write careful code that knows whether any methods it's
> calling can fire sync events and RefPtrs all the appropriate nodes. I have a
> proposal to automate this in https://bugs.webkit.org/show_bug.cgi?id=80041.
> It certainly makes the code cleaner and safer, but it comes at a performance
> cost in some cases.
>
> Basically, any scope that needs to be careful of sync events adds a
> DOMRemovalScope at the top which keeps nodes from getting destroyed until
> the scope is destroyed (DOMRemovalScope adds them to a
> Vector<RefPtr<Node>>). In cases where we don't delete nodes, there's no
> performance impact. In cases where we delete nodes, this is always slower.
>
> I uploaded two performance tests to that bug:
> 1. Set innerHTML = "" on a node that has half a million children. This test
> goes from ~166ms to ~172ms on my machine. A 3.6% regression.
> 2. Destroy half a million nodes *during* a synchronous event (uses
> range.deleteContents). Goes from ~284ms to ~342ms. A 20% regression.
>
> So destroying Nodes during synchronous events fired during a DOM mutation is
> significantly slower. This case is rare though. I had to think hard to come
> up with a case where we would hit this. For the most part, nodes don't
> actually get destroyed due to JS until a garbage collection occurs, which is
> usually after the event has completed and the DOMRemovalScope has been
> destroyed.
>
> The advantage of this is that it gives a simple way to address a common
> class of crash and potentially security bugs. The disadvantage of course is
> the possible performance hit.
>
> What do you think? Is this worth trying? Are there better ideas?
>
> Ojan
>
> _______________________________________________
> webkit-dev mailing list
> [email protected]
> http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev
>
_______________________________________________
webkit-dev mailing list
[email protected]
http://lists.webkit.org/mailman/listinfo.cgi/webkit-dev

Reply via email to