Skip to content

Instantly share code, notes, and snippets.

@radarek
Created December 29, 2015 14:33
Show Gist options
  • Select an option

  • Save radarek/174eb80460d828655cb8 to your computer and use it in GitHub Desktop.

Select an option

Save radarek/174eb80460d828655cb8 to your computer and use it in GitHub Desktop.

Revisions

  1. radarek created this gist Dec 29, 2015.
    53 changes: 53 additions & 0 deletions how_many_nodes.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,53 @@
    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)
    147 changes: 147 additions & 0 deletions results.txt
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,147 @@
    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