Created
December 29, 2015 14:33
-
-
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
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
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) |
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
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