Improved perf of XPath::Evaluator#node_matches?
Using the benchmark xpath/evaluator/node_matches_bench.rb the results prior to this commit were as following for 3 cases: name only: 737633 i/s namespace wildcard: 612196 i/s name wildcard: 516030 i/s With this commit said numbers have changed to the following: name only: 746086 i/s namespace wildcard: 1097168 i/s name wildcard: 1151255 i/s This results in the following increase of performance for each case: name only: 1,011x (insignificant) namespace wildcard: 1,79x name wildcard: 2,23x In the benchmark xpath/evaluator/big_xml_average_bench.rb the difference isn't really noticable as said benchmark only queries elements by names, of which the performance hasn't really improved.
This commit is contained in:
parent
361374c813
commit
b5e63dc50e
|
@ -59,6 +59,9 @@ module Oga
|
||||||
# evaluator.evaluate('$number') # => 10
|
# evaluator.evaluate('$number') # => 10
|
||||||
#
|
#
|
||||||
class Evaluator
|
class Evaluator
|
||||||
|
# Wildcard for node names/namespace prefixes.
|
||||||
|
STAR = '*'
|
||||||
|
|
||||||
##
|
##
|
||||||
# @param [Oga::XML::Document|Oga::XML::Node] document
|
# @param [Oga::XML::Document|Oga::XML::Node] document
|
||||||
# @param [Hash] variables Hash containing variables to expose to the XPath
|
# @param [Hash] variables Hash containing variables to expose to the XPath
|
||||||
|
@ -534,7 +537,7 @@ module Oga
|
||||||
next unless context_node.respond_to?(:available_namespaces)
|
next unless context_node.respond_to?(:available_namespaces)
|
||||||
|
|
||||||
context_node.available_namespaces.each do |_, namespace|
|
context_node.available_namespaces.each do |_, namespace|
|
||||||
if namespace.name == name or name == '*'
|
if namespace.name == name or name == STAR
|
||||||
nodes << namespace
|
nodes << namespace
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -1643,8 +1646,8 @@ module Oga
|
||||||
|
|
||||||
# If only the name is given and is a wildcard then we'll also want to
|
# If only the name is given and is a wildcard then we'll also want to
|
||||||
# match the namespace as a wildcard.
|
# match the namespace as a wildcard.
|
||||||
if !ns and name == '*'
|
if !ns and name == STAR
|
||||||
ns = '*'
|
ns = STAR
|
||||||
end
|
end
|
||||||
|
|
||||||
name_matches = name_matches?(xml_node, name)
|
name_matches = name_matches?(xml_node, name)
|
||||||
|
@ -1686,7 +1689,7 @@ module Oga
|
||||||
def name_matches?(xml_node, name)
|
def name_matches?(xml_node, name)
|
||||||
return false unless xml_node.respond_to?(:name)
|
return false unless xml_node.respond_to?(:name)
|
||||||
|
|
||||||
return xml_node.name == name || name == '*'
|
return name == STAR ? true : xml_node.name == name
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
@ -1699,7 +1702,7 @@ module Oga
|
||||||
def namespace_matches?(xml_node, ns)
|
def namespace_matches?(xml_node, ns)
|
||||||
return false unless xml_node.respond_to?(:namespace)
|
return false unless xml_node.respond_to?(:namespace)
|
||||||
|
|
||||||
return xml_node.namespace.to_s == ns || ns == '*'
|
return ns == STAR ? true : xml_node.namespace.to_s == ns
|
||||||
end
|
end
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
Loading…
Reference in New Issue