Last active
May 18, 2023 12:35
-
-
Save flavorjones/4875b772b7517185913bded8e18b1ed5 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#! /usr/bin/env ruby | |
require "bundler/inline" | |
gemfile do | |
source "https://rubygems.org" | |
gem "builder" | |
gem "nokogiri" | |
gem "benchmark-ips" | |
end | |
require "builder" | |
require "nokogiri" | |
require "benchmark/ips" | |
N = 100 | |
# using Builder::XmlMarkup, build an XML document representing attributes of a person | |
def builder_person | |
xml = Builder::XmlMarkup.new | |
xml.people do |p| | |
N.times do | |
xml.person do |p| | |
p.name "John Doe" | |
p.age 42 | |
p.address do |a| | |
a.street "123 Main Street" | |
a.city "Anytown" | |
end | |
end | |
end | |
end | |
end | |
# using Nokogiri::XML::Builder, build an XML document representing attributes of a person | |
def nokogiri_person | |
Nokogiri::XML::Builder.new do |xml| | |
xml.people do | |
N.times do | |
xml.person do |p| | |
p.name "John Doe" | |
p.age 42 | |
p.address do |a| | |
a.street "123 Main Street" | |
a.city "Anytown" | |
end | |
end | |
end | |
end | |
end.to_xml | |
end | |
# use Nokogiri's bare API to build an XML document representing attributes of a person | |
def nokogiri_raw_person | |
doc = Nokogiri::XML::Document.new | |
doc.root = doc.create_element("people") | |
N.times do | |
doc.root.add_child(doc.create_element("person")).tap do |p| | |
p.add_child(doc.create_element("name", "John Doe")) | |
p.add_child(doc.create_element("age", 42)) | |
p.add_child(doc.create_element("address")).tap do |a| | |
a.add_child(doc.create_element("street", "123 Main Street")) | |
a.add_child(doc.create_element("city", "Anytown")) | |
end | |
end | |
end | |
doc.to_xml | |
end | |
puts RUBY_DESCRIPTION | |
# pp builder_person | |
# pp nokogiri_person | |
# pp nokogiri_raw_person | |
Benchmark.ips do |x| | |
x.report("Builder") { builder_person } | |
x.report("Nokogiri::XML::Builder") { nokogiri_person } | |
x.report("Nokogiri::XML::Document") { nokogiri_raw_person } | |
x.compare! | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
$ ruby ./issues/benchmark-xml-builders.rb | |
ruby 3.2.2 (2023-03-30 revision e51014f9c0) [x86_64-linux] | |
Warming up -------------------------------------- | |
Builder 54.000 i/100ms | |
Nokogiri::XML::Builder | |
47.000 i/100ms | |
Nokogiri::XML::Document | |
47.000 i/100ms | |
Calculating ------------------------------------- | |
Builder 539.632 (± 7.6%) i/s - 2.700k in 5.034709s | |
Nokogiri::XML::Builder | |
475.543 (± 8.6%) i/s - 2.397k in 5.086260s | |
Nokogiri::XML::Document | |
722.282 (± 5.7%) i/s - 3.619k in 5.028424s | |
Comparison: | |
Nokogiri::XML::Document: 722.3 i/s | |
Builder: 539.6 i/s - 1.34x slower | |
Nokogiri::XML::Builder: 475.5 i/s - 1.52x slower |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment