Skip to content

Commit

Permalink
Optimize SAX2Parser#get_namespace (#207)
Browse files Browse the repository at this point in the history
```
RUBYLIB= BUNDLER_ORIG_RUBYLIB= /Users/naitoh/.rbenv/versions/3.3.4/bin/ruby -v -S benchmark-driver /Users/naitoh/ghq/github.com/naitoh/rexml/benchmark/parse.yaml
ruby 3.3.4 (2024-07-09 revision be1089c8ec) [arm64-darwin22]
Calculating -------------------------------------
                         before       after  before(YJIT)  after(YJIT)
                 dom     18.085      17.677        33.086       32.778 i/s -     100.000 times in 5.529372s 5.657097s 3.022471s 3.050832s
                 sax     25.450      26.182        44.797       47.916 i/s -     100.000 times in 3.929249s 3.819475s 2.232309s 2.086982s
                pull     29.160      29.089        55.407       53.531 i/s -     100.000 times in 3.429304s 3.437757s 1.804825s 1.868072s
              stream     29.137      29.055        52.780       51.368 i/s -     100.000 times in 3.432007s 3.441754s 1.894649s 1.946724s

Comparison:
                              dom
        before(YJIT):        33.1 i/s
         after(YJIT):        32.8 i/s - 1.01x  slower
              before:        18.1 i/s - 1.83x  slower
               after:        17.7 i/s - 1.87x  slower

                              sax
         after(YJIT):        47.9 i/s
        before(YJIT):        44.8 i/s - 1.07x  slower
               after:        26.2 i/s - 1.83x  slower
              before:        25.5 i/s - 1.88x  slower

                             pull
        before(YJIT):        55.4 i/s
         after(YJIT):        53.5 i/s - 1.04x  slower
              before:        29.2 i/s - 1.90x  slower
               after:        29.1 i/s - 1.90x  slower

                           stream
        before(YJIT):        52.8 i/s
         after(YJIT):        51.4 i/s - 1.03x  slower
              before:        29.1 i/s - 1.81x  slower
               after:        29.1 i/s - 1.82x  slower
```

- sax
  - YJIT=ON : 1.07x faster
  - YJIT=OFF : 1.03x faster
  • Loading branch information
naitoh authored Sep 24, 2024
1 parent 35ee73e commit 2e1cd64
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 0 deletions.
2 changes: 2 additions & 0 deletions lib/rexml/parsers/sax2parser.rb
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,8 @@ def add( pair )
end

def get_namespace( prefix )
return nil if @namespace_stack.empty?

uris = (@namespace_stack.find_all { |ns| not ns[prefix].nil? }) ||
(@namespace_stack.find { |ns| not ns[nil].nil? })
uris[-1][prefix] unless uris.nil? or 0 == uris.size
Expand Down
46 changes: 46 additions & 0 deletions test/test_sax.rb
Original file line number Diff line number Diff line change
Expand Up @@ -99,6 +99,52 @@ def test_sax2
end
end

def test_without_namespace
xml = <<-XML
<root >
<a att1='1' att2='2' att3='&lt;'>
<b />
</a>
</root>
XML

parser = REXML::Parsers::SAX2Parser.new(xml)
elements = []
parser.listen(:start_element) do |uri, localname, qname, attrs|
elements << [uri, localname, qname, attrs]
end
parser.parse
assert_equal([
[nil, "root", "root", {}],
[nil, "a", "a", {"att1"=>"1", "att2"=>"2", "att3"=>"&lt;"}],
[nil, "b", "b", {}]
], elements)
end

def test_with_namespace
xml = <<-XML
<root xmlns="http://example.org/default"
xmlns:foo="http://example.org/foo"
xmlns:bar="http://example.org/bar">
<a foo:att='1' bar:att='2' att='&lt;'>
<bar:b />
</a>
</root>
XML

parser = REXML::Parsers::SAX2Parser.new(xml)
elements = []
parser.listen(:start_element) do |uri, localname, qname, attrs|
elements << [uri, localname, qname, attrs]
end
parser.parse
assert_equal([
["http://example.org/default", "root", "root", {"xmlns"=>"http://example.org/default", "xmlns:bar"=>"http://example.org/bar", "xmlns:foo"=>"http://example.org/foo"}],
["http://example.org/default", "a", "a", {"att"=>"&lt;", "bar:att"=>"2", "foo:att"=>"1"}],
["http://example.org/bar", "b", "bar:b", {}]
], elements)
end

class EntityExpansionLimitTest < Test::Unit::TestCase
class GeneralEntityTest < self
def test_have_value
Expand Down

0 comments on commit 2e1cd64

Please sign in to comment.