benchmark/ips
require 'benchmark/ips'
require 'set'
$
list = ('a'..'zzzz').to_a
set = Set.new list
$
Benchmark.ips do |x|
x.report("set access") { set.include? "foo" }
$
x.report("ary access") { list.include? "foo" }
end
G
EM
Slide 42
Slide 42 text
ग़ྗ
Calculating -------------------------------------
set access 68622 i/100ms
ary access 395 i/100ms
-------------------------------------------------
set access 3047175.3 (±12.7%) i/s - 14959596 in 5.018692s
ary access 3899.2 (±7.1%) i/s - 19750 in 5.096118s
߹
ܭ
IPS
࣮ߦͷάϥϑ
10,000 ܁Γฦ࣌ؒ͢ (seconds)
0.01
0.1
1
10
100
ΩϟογϡɹαΠζ
10 elements 100 elements 1000 elements 100000 elements
Ωϟογϡ 1
Ωϟογϡ 2
Slide 49
Slide 49 text
Cacheͷ࣮
class Cache1
def initialize
@cache = {}
end
def [] k; @cache[k]; end
def []= k,v; @cache[k] = v; end
end
$
class Cache2
def initialize
@cache = []
end
def [] k; x, = @cache.assoc(k); x; end
def []= k,v; @cache << [k, v]; end
end
ఆ
ઢܗ
Slide 50
Slide 50 text
۩ମతͳྫ
Routes
Slide 51
Slide 51 text
Route දͷେ͖͞
link_to ʹؔ͋Δʁ
Slide 52
Slide 52 text
route ΛೖΕΔ
class MyTest
routes = ActionDispatch::Routing::RouteSet.new
routes.draw {
resources(:articles)
N.times do |num|
resources num.to_s.to_sym
end
}
end
10, 100, 1000
Tag Options
def tag_option(key, value, escape)
if value.is_a?(Array)
value = escape ?
safe_join(value, " ") :
value.join(" ")
else
value = escape ? ERB::Util.h(value) : value
end
%(#{key}="#{value}")
end
ERB::Utils.h
def html_escape(s)
s = s.to_s
if s.html_safe?
s
else
s.gsub(HTML_ESCAPE_REGEXP, HTML_ESCAPE).html_safe
end
end
Slide 83
Slide 83 text
Creates 2 Objects.
Slide 84
Slide 84 text
Tag Options
def tag_option(key, value, escape)
if value.is_a?(Array)
value = escape ?
safe_join(value, " ") :
value.join(" ")
else
value = escape ? ERB::Util.h(value) : value
end
%(#{key}="#{value}")
end
Slide 85
Slide 85 text
String
SafeBuffer
String
Slide 86
Slide 86 text
Extract Method
def unwrapped_html_escape(s) # :nodoc:
s = s.to_s
if s.html_safe?
s
else
s.gsub(HTML_ESCAPE_REGEXP, HTML_ESCAPE)
end
end
$
def html_escape(s)
unwrapped_html_escape(s).html_safe
end
Slide 87
Slide 87 text
Update Callers
def tag_option(key, value, escape)
if value.is_a?(Array)
value = escape ?
safe_join(value, " ") :
value.join(" ")
else
value = escape ?
ERB::Util.unwrapped_html_escape(value) :
value
end
%(#{key}="#{value}")
end
Slide 88
Slide 88 text
String
String
Slide 89
Slide 89 text
~200 Allocations
Per Request
for /books/new
Slide 90
Slide 90 text
YMMV
(Your Mileage (kilometers?) May Vary)
Slide 91
Slide 91 text
Speeding up
Output
Slide 92
Slide 92 text
ERB Template
<% books.each do |book| %>
<%= book.name %>
<% end %>