Skip to content

Instantly share code, notes, and snippets.

@casperisfine
Created May 1, 2024 11:15
Show Gist options
  • Save casperisfine/b5de68891408d6eab2090b6cdd1064f5 to your computer and use it in GitHub Desktop.
Save casperisfine/b5de68891408d6eab2090b6cdd1064f5 to your computer and use it in GitHub Desktop.
# frozen_string_literal: true
require 'bundler/inline'
gemfile do
source 'https://rubygems.org'
gem 'benchmark-ips'
gem 'xrb'
gem 'erb'
gem 'erubi'
end
ERB_SRC = <<~'ERB'
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent gravida, turpis id bibendum bibendum, ipsum diam vestibulum arcu, sit amet tempor ipsum lorem non urna. Suspendisse nec nisl a risus laoreet lacinia ac sit amet neque. Mauris vel turpis semper massa bibendum viverra. Curabitur vel felis est. Donec sed faucibus augue, ac molestie purus. Nulla a lectus dui. Quisque id scelerisque urna. Aenean in vehicula nibh, in aliquam turpis. <%='Suspendisse'%> iaculis suscipit lectus in efficitur. Nulla facilisi. Fusce facilisis, justo ac eleifend convallis, ligula est bibendum risus, a consequat metus sapien eget mauris. Sed quis mollis tellus, sed tempor lacus. Proin et efficitur metus. Vestibulum blandit tellus sed turpis tincidunt, in aliquet augue bibendum. Suspendisse venenatis faucibus lectus sed convallis.
<%='Curabitur'%> aliquet ligula et volutpat efficitur. Duis sed tortor elit. Quisque justo eros, maximus quis elit sed, accumsan faucibus lectus. Nulla blandit quam urna, ac bibendum turpis semper quis. Proin a ligula eu eros semper condimentum. Ut pellentesque, justo sed malesuada condimentum, est massa tempor turpis, id facilisis neque odio eu neque. Morbi convallis laoreet tortor, ut dapibus mi accumsan a. Proin convallis neque sed leo blandit lacinia. Phasellus porta odio nunc, quis placerat sem facilisis quis. Quisque et <%='ornare'%> elit. Duis efficitur cursus lectus vitae placerat. In lacinia eros nec feugiat finibus.
Morbi orci magna, tempor at convallis sed, porta elementum nulla. Aliquam sit amet fringilla felis, eget volutpat lorem. Pellentesque laoreet, elit quis fringilla ultricies, leo nisl semper mauris, ac feugiat libero tortor id urna. Praesent ligula augue, mollis nec justo vitae, faucibus posuere risus. Praesent blandit molestie ex eu fringilla. Ut non vehicula mauris. Aliquam gravida rutrum laoreet. Pellentesque facilisis mi ipsum, ac dapibus mi iaculis nec.
Vestibulum sit amet nibh velit. Sed rhoncus odio ut nisi blandit vestibulum. Aliquam erat volutpat. Suspendisse sed posuere ligula. Proin ex ex, pharetra vel dui vulputate, pellentesque ullamcorper metus. Cras imperdiet dictum lorem. Nullam eleifend nunc eu metus ullamcorper dignissim. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet sem sed enim rutrum volutpat a non libero.
<% 10.downto(1) do |i| %>
<%=i%> bottle<%=i == 1 ? '' : 's'%> of beer on the wall,
<%=i%> bottle<%=i == 1 ? '' : 's'%> of beer,
Take one down and pass it around,
<%=i-1%> bottle<%=i == 1 ? '' : 's'%> of beer on the wall.
<% end %>
Integer in ligula at ex gravida pellentesque in et felis. Nulla dolor sapien, pretium a odio a, consectetur ultrices justo. Suspendisse libero quam, pulvinar eu est non, fermentum volutpat nisl. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras at dapibus lorem, nec imperdiet quam. Proin ut tellus sagittis, sollicitudin elit ac, porttitor diam. Quisque at hendrerit lacus, sit amet mollis lacus.
ERB
XRB_SRC = <<~'XRB'
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent gravida, turpis id bibendum bibendum, ipsum diam vestibulum arcu, sit amet tempor ipsum lorem non urna. Suspendisse nec nisl a risus laoreet lacinia ac sit amet neque. Mauris vel turpis semper massa bibendum viverra. Curabitur vel felis est. Donec sed faucibus augue, ac molestie purus. Nulla a lectus dui. Quisque id scelerisque urna. Aenean in vehicula nibh, in aliquam turpis. #{'Suspendisse'} iaculis suscipit lectus in efficitur. Nulla facilisi. Fusce facilisis, justo ac eleifend convallis, ligula est bibendum risus, a consequat metus sapien eget mauris. Sed quis mollis tellus, sed tempor lacus. Proin et efficitur metus. Vestibulum blandit tellus sed turpis tincidunt, in aliquet augue bibendum. Suspendisse venenatis faucibus lectus sed convallis.
#{'Curabitur'} aliquet ligula et volutpat efficitur. Duis sed tortor elit. Quisque justo eros, maximus quis elit sed, accumsan faucibus lectus. Nulla blandit quam urna, ac bibendum turpis semper quis. Proin a ligula eu eros semper condimentum. Ut pellentesque, justo sed malesuada condimentum, est massa tempor turpis, id facilisis neque odio eu neque. Morbi convallis laoreet tortor, ut dapibus mi accumsan a. Proin convallis neque sed leo blandit lacinia. Phasellus porta odio nunc, quis placerat sem facilisis quis. Quisque et #{'ornare'} elit. Duis efficitur cursus lectus vitae placerat. In lacinia eros nec feugiat finibus.
Morbi orci magna, tempor at convallis sed, porta elementum nulla. Aliquam sit amet fringilla felis, eget volutpat lorem. Pellentesque laoreet, elit quis fringilla ultricies, leo nisl semper mauris, ac feugiat libero tortor id urna. Praesent ligula augue, mollis nec justo vitae, faucibus posuere risus. Praesent blandit molestie ex eu fringilla. Ut non vehicula mauris. Aliquam gravida rutrum laoreet. Pellentesque facilisis mi ipsum, ac dapibus mi iaculis nec.
Vestibulum sit amet nibh velit. Sed rhoncus odio ut nisi blandit vestibulum. Aliquam erat volutpat. Suspendisse sed posuere ligula. Proin ex ex, pharetra vel dui vulputate, pellentesque ullamcorper metus. Cras imperdiet dictum lorem. Nullam eleifend nunc eu metus ullamcorper dignissim. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Aenean sit amet sem sed enim rutrum volutpat a non libero.
<?r 10.downto(1) do |i| ?>
#{i} bottle#{i == 1 ? '' : 's'} of beer on the wall,
#{i} bottle#{i == 1 ? '' : 's'} of beer,
Take one down and pass it around,
#{i-1} bottle#{i == 1 ? '' : 's'} of beer on the wall.
<?r end ?>
Integer in ligula at ex gravida pellentesque in et felis. Nulla dolor sapien, pretium a odio a, consectetur ultrices justo. Suspendisse libero quam, pulvinar eu est non, fermentum volutpat nisl. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Cras at dapibus lorem, nec imperdiet quam. Proin ut tellus sagittis, sollicitudin elit ac, porttitor diam. Quisque at hendrerit lacus, sit amet mollis lacus.
XRB
erb_template = ERB.new(ERB_SRC)
module Templates
extend self
erubi_src = Erubi::Engine.new(ERB_SRC, freeze_template_literals: false, chain_appends: true).src
class_eval <<~RUBY
# frozen_string_literal: true
def erubi_render
#{erubi_src}
end
RUBY
end
erb_template = ERB.new(ERB_SRC)
xrb_template = XRB::Template.new(XRB::Buffer.load(XRB_SRC))
Benchmark.ips do |x|
x.report('ERB (eval)') { erb_template.result }
x.report('XRB') { xrb_template.to_string }
x.report('ERB (erubi)') { Templates.erubi_render }
x.compare!(order: :baseline)
end
$ ruby --yjit /tmp/xrb.rb
ruby 3.3.1 (2024-04-23 revision c56cd86388) +YJIT [arm64-darwin23]
Warming up --------------------------------------
ERB (eval) 1.583k i/100ms
XRB 15.180k i/100ms
ERB (erubi) 26.784k i/100ms
Calculating -------------------------------------
ERB (eval) 17.095k (± 3.6%) i/s - 85.482k in 5.007658s
XRB 152.778k (± 3.3%) i/s - 774.180k in 5.073407s
ERB (erubi) 271.431k (± 3.7%) i/s - 1.366M in 5.039967s
Comparison:
ERB (eval): 17095.4 i/s
ERB (erubi): 271430.6 i/s - 15.88x faster
XRB: 152777.8 i/s - 8.94x faster
$ ruby /tmp/xrb.rb
ruby 3.3.1 (2024-04-23 revision c56cd86388) [arm64-darwin23]
Warming up --------------------------------------
ERB (eval) 1.776k i/100ms
XRB 8.120k i/100ms
ERB (erubi) 21.223k i/100ms
Calculating -------------------------------------
ERB (eval) 17.510k (± 1.9%) i/s - 88.800k in 5.073113s
XRB 80.523k (± 1.7%) i/s - 406.000k in 5.043431s
ERB (erubi) 209.773k (± 1.6%) i/s - 1.061M in 5.059922s
Comparison:
ERB (eval): 17510.3 i/s
ERB (erubi): 209772.8 i/s - 11.98x faster
XRB: 80523.4 i/s - 4.60x faster
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment