Created
May 1, 2024 11:15
-
-
Save casperisfine/b5de68891408d6eab2090b6cdd1064f5 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
# 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 |
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 --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