Skip to content

Instantly share code, notes, and snippets.

@radarek
Created December 29, 2015 14:33
Show Gist options
  • Save radarek/174eb80460d828655cb8 to your computer and use it in GitHub Desktop.
Save radarek/174eb80460d828655cb8 to your computer and use it in GitHub Desktop.
Veryfing "Table 1—Number of additional T_NODE objects created by an iterator" from "Ruby Performance Optimization" book
def count_nodes(label)
before = ObjectSpace.count_objects
yield
after = ObjectSpace.count_objects
puts " #{label} created T_NODE: %d" % (after[:T_NODE] - before[:T_NODE])
end
class MyClass
include Enumerable
def each
yield 1
yield 2
yield 3
end
end
GC.disable
puts "RUBY_VERSION: #{RUBY_VERSION}"
def measure(title, enum)
puts "------ Measuring #{title} -----"
count_nodes("#all?") { enum.dup.all? { |e| e > 1 } }
count_nodes("#any?") { enum.dup.any? { |e| e > 1 } }
count_nodes("#collect") { enum.dup.collect { |e| e * 2 } }
count_nodes("#cycle") { enum.dup.cycle(2).to_a }
count_nodes("#delete_if") { enum.dup.delete_if { |e| e > 1 } } if enum.respond_to?(:delete_if)
count_nodes("#detect") { enum.dup.detect { |e| e > 1 } }
count_nodes("#each") { enum.dup.each { |e| e + 1 } }
count_nodes("#each_index") { enum.dup.each_index { |e| e + 1 } } if enum.respond_to?(:each_index)
count_nodes("#each_with_index") { enum.dup.each_with_index { |e, i| e + i } }
count_nodes("#each_with_object") { enum.dup.each_with_object(123) { |e, o| e + o } }
count_nodes("#fill") { enum.dup.fill { "x" } } if enum.respond_to?(:fill)
count_nodes("#find") { enum.dup.find { |e| e > 1 } }
count_nodes("#find_all") { enum.dup.find_all { |e| e > 1 } }
count_nodes("#grep") { enum.dup.grep(/\d/) }
count_nodes("#inject") { enum.dup.inject(0) { |sum, e| sum + e } }
count_nodes("#map") { enum.dup.map { |e| e * 2 } }
count_nodes("#none?") { enum.dup.none? { |e| e > 1 } }
count_nodes("#one?") { enum.dup.one? { |e| e > 1 } }
count_nodes("#reduce") { enum.dup.reduce(0) { |sum, e| sum + e } }
count_nodes("#reject") { enum.dup.reject { |e| e > 1 } }
count_nodes("#reverse_each") { enum.dup.reverse_each { |e| e + 1 } }
count_nodes("#select") { enum.dup.select { |e| e > 1 } }
puts "\n\n"
end
measure("Array", [1, 2, 3])
measure("MyClass (Enumerable)", MyClass.new)
RUBY_VERSION: 2.1.5
------ Measuring Array -----
#all? created T_NODE: 3
#any? created T_NODE: 3
#collect created T_NODE: 0
#cycle created T_NODE: 2
#delete_if created T_NODE: 0
#detect created T_NODE: 3
#each created T_NODE: 0
#each_index created T_NODE: 0
#each_with_index created T_NODE: 2
#each_with_object created T_NODE: 1
#fill created T_NODE: 0
#find created T_NODE: 3
#find_all created T_NODE: 1
#grep created T_NODE: 3
#inject created T_NODE: 2
#map created T_NODE: 0
#none? created T_NODE: 3
#one? created T_NODE: 3
#reduce created T_NODE: 2
#reject created T_NODE: 0
#reverse_each created T_NODE: 0
#select created T_NODE: 0
------ Measuring MyClass (Enumerable) -----
#all? created T_NODE: 3
#any? created T_NODE: 3
#collect created T_NODE: 1
#cycle created T_NODE: 3
#detect created T_NODE: 3
#each created T_NODE: 0
#each_with_index created T_NODE: 2
#each_with_object created T_NODE: 1
#find created T_NODE: 3
#find_all created T_NODE: 1
#grep created T_NODE: 3
#inject created T_NODE: 2
#map created T_NODE: 1
#none? created T_NODE: 3
#one? created T_NODE: 3
#reduce created T_NODE: 2
#reject created T_NODE: 1
#reverse_each created T_NODE: 1
#select created T_NODE: 1
RUBY_VERSION: 2.2.4
------ Measuring Array -----
#all? created T_NODE: 3
#any? created T_NODE: 0
#collect created T_NODE: 0
#cycle created T_NODE: 2
#delete_if created T_NODE: 0
#detect created T_NODE: 3
#each created T_NODE: 0
#each_index created T_NODE: 0
#each_with_index created T_NODE: 2
#each_with_object created T_NODE: 1
#fill created T_NODE: 0
#find created T_NODE: 3
#find_all created T_NODE: 1
#grep created T_NODE: 3
#inject created T_NODE: 2
#map created T_NODE: 0
#none? created T_NODE: 3
#one? created T_NODE: 3
#reduce created T_NODE: 2
#reject created T_NODE: 0
#reverse_each created T_NODE: 0
#select created T_NODE: 0
------ Measuring MyClass (Enumerable) -----
#all? created T_NODE: 3
#any? created T_NODE: 3
#collect created T_NODE: 1
#cycle created T_NODE: 3
#detect created T_NODE: 3
#each created T_NODE: 0
#each_with_index created T_NODE: 2
#each_with_object created T_NODE: 1
#find created T_NODE: 3
#find_all created T_NODE: 1
#grep created T_NODE: 3
#inject created T_NODE: 2
#map created T_NODE: 1
#none? created T_NODE: 3
#one? created T_NODE: 3
#reduce created T_NODE: 2
#reject created T_NODE: 1
#reverse_each created T_NODE: 1
#select created T_NODE: 1
RUBY_VERSION: 2.3.0
------ Measuring Array -----
#all? created T_NODE: 0
#any? created T_NODE: 0
#collect created T_NODE: 0
#cycle created T_NODE: 0
#delete_if created T_NODE: 0
#detect created T_NODE: 0
#each created T_NODE: 0
#each_index created T_NODE: 0
#each_with_index created T_NODE: 0
#each_with_object created T_NODE: 0
#fill created T_NODE: 0
#find created T_NODE: 0
#find_all created T_NODE: 0
#grep created T_NODE: 0
#inject created T_NODE: 0
#map created T_NODE: 0
#none? created T_NODE: 0
#one? created T_NODE: 0
#reduce created T_NODE: 0
#reject created T_NODE: 0
#reverse_each created T_NODE: 0
#select created T_NODE: 0
------ Measuring MyClass (Enumerable) -----
#all? created T_NODE: 0
#any? created T_NODE: 0
#collect created T_NODE: 0
#cycle created T_NODE: 0
#detect created T_NODE: 0
#each created T_NODE: 0
#each_with_index created T_NODE: 0
#each_with_object created T_NODE: 0
#find created T_NODE: 0
#find_all created T_NODE: 0
#grep created T_NODE: 0
#inject created T_NODE: 0
#map created T_NODE: 0
#none? created T_NODE: 0
#one? created T_NODE: 0
#reduce created T_NODE: 0
#reject created T_NODE: 0
#reverse_each created T_NODE: 0
#select created T_NODE: 0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment