Skip to content

Commit 26545fc

Browse files
committed
Add benchmark
## Benchmark ``` $ benchmark-driver benchmark/parse_doctype.yaml Calculating ------------------------------------- before after before(YJIT) after(YJIT) single_entity(dom) 22.381k 24.492k 5.098k 5.211k i/s - 100.000 times in 0.004468s 0.004083s 0.019615s 0.019189s single_entity(stream) 46.882k 48.054k 8.796k 8.691k i/s - 100.000 times in 0.002133s 0.002081s 0.011369s 0.011506s chained_entities(dom) 2.665k 2.531k 2.349k 2.340k i/s - 100.000 times in 0.037520s 0.039509s 0.042574s 0.042726s chained_entities(stream) 2.455k 2.387k 2.351k 2.290k i/s - 100.000 times in 0.040732s 0.041888s 0.042538s 0.043660s many_entities(dom) 675.927 679.094 684.308 674.686 i/s - 100.000 times in 0.147945s 0.147255s 0.146133s 0.148217s many_entities(stream) 2.602k 2.501k 2.403k 2.276k i/s - 100.000 times in 0.038427s 0.039986s 0.041607s 0.043944s repeated_entity(dom) 419.090 414.295 445.286 444.575 i/s - 100.000 times in 0.238612s 0.241374s 0.224575s 0.224934s repeated_entity(stream) 1.449k 1.401k 1.590k 1.582k i/s - 100.000 times in 0.069014s 0.071358s 0.062898s 0.063201s Comparison: single_entity(dom) after: 24491.8 i/s before: 22381.4 i/s - 1.09x slower after(YJIT): 5211.3 i/s - 4.70x slower before(YJIT): 5098.1 i/s - 4.80x slower single_entity(stream) after: 48053.8 i/s before: 46882.3 i/s - 1.02x slower before(YJIT): 8795.8 i/s - 5.46x slower after(YJIT): 8691.1 i/s - 5.53x slower chained_entities(dom) before: 2665.2 i/s after: 2531.1 i/s - 1.05x slower before(YJIT): 2348.9 i/s - 1.13x slower after(YJIT): 2340.5 i/s - 1.14x slower chained_entities(stream) before: 2455.1 i/s after: 2387.3 i/s - 1.03x slower before(YJIT): 2350.8 i/s - 1.04x slower after(YJIT): 2290.4 i/s - 1.07x slower many_entities(dom) before(YJIT): 684.3 i/s after: 679.1 i/s - 1.01x slower before: 675.9 i/s - 1.01x slower after(YJIT): 674.7 i/s - 1.01x slower many_entities(stream) before: 2602.3 i/s after: 2500.9 i/s - 1.04x slower before(YJIT): 2403.4 i/s - 1.08x slower after(YJIT): 2275.6 i/s - 1.14x slower repeated_entity(dom) before(YJIT): 445.3 i/s after(YJIT): 444.6 i/s - 1.00x slower before: 419.1 i/s - 1.06x slower after: 414.3 i/s - 1.07x slower repeated_entity(stream) before(YJIT): 1589.9 i/s after(YJIT): 1582.3 i/s - 1.00x slower before: 1449.0 i/s - 1.10x slower after: 1401.4 i/s - 1.13x slower ``` - YJIT=ON : 0.95 - 1.09x faster - YJIT=OFF : 0.94 - 1.02x faster
1 parent a103860 commit 26545fc

1 file changed

Lines changed: 77 additions & 0 deletions

File tree

benchmark/parse_doctype.yaml

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
loop_count: 100
2+
contexts:
3+
- gems:
4+
rexml: 3.2.6
5+
require: false
6+
prelude: require 'rexml'
7+
- name: master
8+
prelude: |
9+
$LOAD_PATH.unshift(File.expand_path("lib"))
10+
require 'rexml'
11+
- name: 3.2.6(YJIT)
12+
gems:
13+
rexml: 3.2.6
14+
require: false
15+
prelude: |
16+
require 'rexml'
17+
RubyVM::YJIT.enable
18+
- name: master(YJIT)
19+
prelude: |
20+
$LOAD_PATH.unshift(File.expand_path("lib"))
21+
require 'rexml'
22+
RubyVM::YJIT.enable
23+
24+
prelude: |
25+
require 'rexml/document'
26+
require 'rexml/parsers/sax2parser'
27+
require 'rexml/parsers/streamparser'
28+
require 'rexml/streamlistener'
29+
30+
# Single entity reference: <!ENTITY foo "bar"> -> &foo;
31+
single_entity_xml = <<~XML
32+
<!DOCTYPE root [
33+
<!ENTITY word "hello">
34+
]>
35+
<root>&word;</root>
36+
XML
37+
38+
# Chained entity references: a -> b -> c -> ... -> value (n_depth levels deep)
39+
n_depth = 100
40+
chained_entities_xml = <<~XML
41+
<!DOCTYPE root [
42+
#{(1..n_depth).map {|i| i == n_depth ? "<!ENTITY e#{i} \"value\">" : "<!ENTITY e#{i} \"&e#{i+1};\">" }.join("\n")}
43+
]>
44+
<root>&e1;</root>
45+
XML
46+
47+
# Many distinct entities referenced in document content
48+
n_entities = 100
49+
many_entities_xml = <<~XML
50+
<!DOCTYPE root [
51+
#{(1..n_entities).map {|i| "<!ENTITY ent#{i} \"value#{i}\">" }.join("\n")}
52+
]>
53+
<root>#{(1..n_entities).map {|i| "&ent#{i};" }.join}</root>
54+
XML
55+
56+
# Same entity referenced repeatedly in attribute values
57+
n_items = 100
58+
repeated_entity_xml = <<~XML
59+
<!DOCTYPE root [
60+
<!ENTITY word "hello">
61+
]>
62+
<root>#{'<item val="&word;">&word;</item>' * n_items}</root>
63+
XML
64+
65+
class Listener
66+
include REXML::StreamListener
67+
end
68+
69+
benchmark:
70+
'single_entity(dom)' : REXML::Document.new(single_entity_xml).root.text
71+
'single_entity(stream)' : REXML::Parsers::StreamParser.new(single_entity_xml, Listener.new).parse
72+
'chained_entities(dom)' : REXML::Document.new(chained_entities_xml).root.text
73+
'chained_entities(stream)': REXML::Parsers::StreamParser.new(chained_entities_xml, Listener.new).parse
74+
'many_entities(dom)' : REXML::Document.new(many_entities_xml).root.text
75+
'many_entities(stream)' : REXML::Parsers::StreamParser.new(many_entities_xml, Listener.new).parse
76+
'repeated_entity(dom)' : REXML::Document.new(repeated_entity_xml).root.text
77+
'repeated_entity(stream)' : REXML::Parsers::StreamParser.new(repeated_entity_xml, Listener.new).parse

0 commit comments

Comments
 (0)