4f94d03a85
This change is broken up in to two parts: 1. Using a Hash to track if a node is already in a NodeSet 2. Only calling take_ownership when an owner is set == Using a Hash Previously various methods such as NodeSet#push and NodeSet#unshift would call Array#include? (on the internal "nodes" Array) to see if a node is already present in the set. This is quite problematic performance wise, especially for large NodeSets. In fact, for the attached benchmark the vast majority of the time was spent in Array#include? calls. Because a NodeSet demands ordering of nodes and must be able to access them by index (something Set can't do without relying on Enumerable), a Hash is used to separately keep track of what nodes are in a NodeSet. This means that checking the presence of a node is simply a matter of checking a Hash key's presence. == Calling take_ownership The if-check for the "owner" variable has been moved out of the "take_ownership" method and into the methods that call "take_ownership". This ensures the method isn't called in the first place if no owner is present, at the cost of slightly more code repetition. The same applies to the "remove_ownership" method. == Conclusion The combined result is a speedup of about 50x when running the attached concurrent_time_bench.rb benchmark. |
||
---|---|---|
.. | ||
css/parser | ||
fixtures | ||
html/lexer | ||
xml | ||
xpath | ||
benchmark_helper.rb |