Last active
August 15, 2023 17:13
-
-
Save technicalpickles/231940b1e64da1762df4a2e8fc53e1d8 to your computer and use it in GitHub Desktop.
Benchmarking Net::HTTPHeader#capitalize
This file contains hidden or 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 '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) |
This file contains hidden or 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
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