Skip to content

Instantly share code, notes, and snippets.

@technicalpickles
Last active August 15, 2023 17:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save technicalpickles/231940b1e64da1762df4a2e8fc53e1d8 to your computer and use it in GitHub Desktop.
Save technicalpickles/231940b1e64da1762df4a2e8fc53e1d8 to your computer and use it in GitHub Desktop.
Benchmarking Net::HTTPHeader#capitalize
# frozen_string_literal: true
require 'benchmark/ips'
require 'benchmark/memory'
def original(name)
name.to_s.split(/-/).map {|s| s.capitalize }.join('-')
end
def string(name)
name.to_s.split('-').map {|s| s.capitalize }.join('-')
end
def each_capitalize_bang(name)
name.to_s.split('-').each {|s| s.capitalize! }.join('-')
end
def capitalize_bang(name)
name.to_s.split('-').map {|s| s.capitalize! || s }.join('-')
end
def map_bang(name)
name.to_s.split('-').map! {|s| s.capitalize }.join('-')
end
def map_bang_capitalize_bang_or(name)
name.to_s.split('-').map! {|s| s.capitalize! || s }.join('-')
end
def map_bang_capitalize_bang_semicolon(name)
name.to_s.split('-').map! {|s| s.capitalize!; s }.join('-')
end
def gsub(name)
name.to_s.gsub(/([^-]+)/) {|s| s.capitalize }
end
def gsub_alt(name)
name.to_s.gsub(/(\A|(?<=[\^\-]))([a-z])/) do |c|
c.upcase!
c
end
end
lowercase_input_dash = "sec-ch-ua-full-version-list"
report = lambda do |x|
x.report "original" do
original(lowercase_input_dash)
end
x.report "string split" do
string(lowercase_input_dash)
end
x.report "each capitalize!" do
each_capitalize_bang(lowercase_input_dash)
end
x.report "capitalize!" do
capitalize_bang(lowercase_input_dash)
end
x.report "map!" do
map_bang(lowercase_input_dash)
end
x.report "map! with capitalize! & logical or" do
map_bang_capitalize_bang_or(lowercase_input_dash)
end
x.report "map! capitalize! & two statements" do
map_bang_capitalize_bang_semicolon(lowercase_input_dash)
end
x.report "gsub" do
gsub(lowercase_input_dash)
end
x.report "gsub alt" do
gsub_alt(lowercase_input_dash)
end
x.compare!
end
Benchmark.ips(&report)
Benchmark.memory(&report)
Warming up --------------------------------------
original 41.691k i/100ms
string split 65.574k i/100ms
each capitalize! 65.062k i/100ms
capitalize! 62.557k i/100ms
map! 66.773k i/100ms
map! with capitalize! & logical or
56.690k i/100ms
map! capitalize! & two statements
60.292k i/100ms
gsub 35.582k i/100ms
gsub alt 37.382k i/100ms
Calculating -------------------------------------
original 421.623k (± 0.9%) i/s - 2.126M in 5.043411s
string split 674.835k (± 0.9%) i/s - 3.410M in 5.053282s
each capitalize! 656.591k (± 1.0%) i/s - 3.318M in 5.054098s
capitalize! 632.284k (± 1.1%) i/s - 3.190M in 5.046440s
map! 670.843k (± 1.3%) i/s - 3.405M in 5.077183s
map! with capitalize! & logical or
638.403k (± 1.1%) i/s - 3.231M in 5.062264s
map! capitalize! & two statements
609.576k (± 1.3%) i/s - 3.075M in 5.045232s
gsub 370.714k (± 1.6%) i/s - 1.886M in 5.088413s
gsub alt 381.659k (± 1.0%) i/s - 1.944M in 5.093680s
Comparison:
string split: 674835.2 i/s
map!: 670842.7 i/s - same-ish: difference falls within error
each capitalize!: 656590.9 i/s - 1.03x slower
map! with capitalize! & logical or: 638402.7 i/s - 1.06x slower
capitalize!: 632283.9 i/s - 1.07x slower
map! capitalize! & two statements: 609576.1 i/s - 1.11x slower
original: 421622.7 i/s - 1.60x slower
gsub alt: 381658.6 i/s - 1.77x slower
gsub: 370713.6 i/s - 1.82x slower
Calculating -------------------------------------
original 1.680k memsize ( 0.000 retained)
20.000 objects ( 0.000 retained)
13.000 strings ( 0.000 retained)
string split 840.000 memsize ( 0.000 retained)
15.000 objects ( 0.000 retained)
13.000 strings ( 0.000 retained)
each capitalize! 760.000 memsize ( 0.000 retained)
14.000 objects ( 0.000 retained)
7.000 strings ( 0.000 retained)
capitalize! 840.000 memsize ( 0.000 retained)
15.000 objects ( 0.000 retained)
7.000 strings ( 0.000 retained)
map! 760.000 memsize ( 0.000 retained)
14.000 objects ( 0.000 retained)
13.000 strings ( 0.000 retained)
map! with capitalize! & logical or
760.000 memsize ( 0.000 retained)
14.000 objects ( 0.000 retained)
7.000 strings ( 0.000 retained)
map! capitalize! & two statements
760.000 memsize ( 0.000 retained)
14.000 objects ( 0.000 retained)
7.000 strings ( 0.000 retained)
gsub 1.816k memsize ( 0.000 retained)
20.000 objects ( 0.000 retained)
13.000 strings ( 0.000 retained)
gsub alt 1.576k memsize ( 0.000 retained)
14.000 objects ( 0.000 retained)
7.000 strings ( 0.000 retained)
Comparison:
map! capitalize! & two statements: 760 allocated
each capitalize!: 760 allocated - same
map!: 760 allocated - same
map! with capitalize! & logical or: 760 allocated - same
string split: 840 allocated - 1.11x more
capitalize!: 840 allocated - 1.11x more
gsub alt: 1576 allocated - 2.07x more
original: 1680 allocated - 2.21x more
gsub: 1816 allocated - 2.39x more
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment