diff --git a/benchmark/attribute.yaml b/benchmark/attribute.yaml
new file mode 100644
index 00000000..5dd7fded
--- /dev/null
+++ b/benchmark/attribute.yaml
@@ -0,0 +1,38 @@
+loop_count: 1000
+contexts:
+ - gems:
+ rexml: 3.2.6
+ require: false
+ prelude: require 'rexml'
+ - name: master
+ prelude: |
+ $LOAD_PATH.unshift(File.expand_path("lib"))
+ require 'rexml'
+ - name: 3.2.6(YJIT)
+ gems:
+ rexml: 3.2.6
+ require: false
+ prelude: |
+ require 'rexml'
+ RubyVM::YJIT.enable
+ - name: master(YJIT)
+ prelude: |
+ $LOAD_PATH.unshift(File.expand_path("lib"))
+ require 'rexml'
+ RubyVM::YJIT.enable
+
+prelude: |
+ require 'rexml/document'
+
+ xml_source = ""
+ 100.times do
+ xml_source = "#{xml_source}"
+ end
+ xml_source = "#{xml_source}"
+
+ document = REXML::Document.new(xml_source)
+ deepest_node = document.elements["//deepest"]
+
+benchmark:
+ with_ns: deepest_node.attribute("with_ns", "xyz")
+ without_ns: deepest_node.attribute("without_ns")
diff --git a/lib/rexml/element.rb b/lib/rexml/element.rb
index 2899759d..a5808d7c 100644
--- a/lib/rexml/element.rb
+++ b/lib/rexml/element.rb
@@ -1276,16 +1276,11 @@ def [](name_or_index)
# document.root.attribute("x", "a") # => a:x='a:x'
#
def attribute( name, namespace=nil )
- prefix = nil
- if namespaces.respond_to? :key
- prefix = namespaces.key(namespace) if namespace
- else
- prefix = namespaces.index(namespace) if namespace
- end
+ prefix = namespaces.key(namespace) if namespace
prefix = nil if prefix == 'xmlns'
ret_val =
- attributes.get_attribute( "#{prefix ? prefix + ':' : ''}#{name}" )
+ attributes.get_attribute( prefix ? "#{prefix}:#{name}" : name )
return ret_val unless ret_val.nil?
return nil if prefix.nil?