Skip to content

Instantly share code, notes, and snippets.

@flada-auxv
Forked from l15n/enumetric.rb
Created September 15, 2012 19:14
Show Gist options
  • Select an option

  • Save flada-auxv/3729363 to your computer and use it in GitHub Desktop.

Select an option

Save flada-auxv/3729363 to your computer and use it in GitHub Desktop.

Revisions

  1. @l15n l15n revised this gist Jun 28, 2012. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion enumetric.rb
    Original file line number Diff line number Diff line change
    @@ -36,7 +36,7 @@ def tally_enumetric(dir = '.')
    puts "Least Used: #{least_common[0]} / #{least_common[1]} times"
    puts "Used once: #{enumerable_usage.select{|k,v| v == 1}.map{|k,v| k}}"
    puts "Never used: #{enumerable_usage.select{|k,v| v.zero?}.map{|k,v| k}}"
    puts "All usage: #{enumerable_usage.sort_by {|k,v| v}.map{|k,v| "#{k}: #{v}"}}"
    puts "All usage: #{enumerable_usage.reject{|k,v| v.zero?}.sort_by {|k,v| v}.map{|k,v| "#{k}: #{v}"}}"
    end

    if __FILE__ == $0
  2. @l15n l15n revised this gist Jun 28, 2012. 1 changed file with 1 addition and 1 deletion.
    2 changes: 1 addition & 1 deletion enumetric.rb
    Original file line number Diff line number Diff line change
    @@ -9,7 +9,7 @@
    def count_usage(method, dir = '.')
    method_delimiter = '[\s\.\{\(=]'
    method = method.to_s.sub('?','\?')
    cmd = "ack --no-group --ruby \"#{method}#{method_delimiter}\" #{dir}"
    cmd = "ack --no-group --ruby \"\\.#{method}#{method_delimiter}\" #{dir}"
    IO.popen(cmd).count
    end

  3. @l15n l15n revised this gist Jun 28, 2012. 1 changed file with 6 additions and 0 deletions.
    6 changes: 6 additions & 0 deletions enumetric.rb
    Original file line number Diff line number Diff line change
    @@ -3,6 +3,9 @@
    # enumetric.rb
    #
    # Rough estimate of usage/non-usage of Enumerable methods

    TRIVIAL_METHODS = [:first, :count, :to_a]

    def count_usage(method, dir = '.')
    method_delimiter = '[\s\.\{\(=]'
    method = method.to_s.sub('?','\?')
    @@ -22,10 +25,13 @@ def tally_enumetric(dir = '.')
    enumerable_count = enumerable_usage.values.reduce(&:+)
    most_common = enumerable_usage.max_by {|k,v| v}
    least_common = enumerable_usage.reject{|k,v| v.zero?}.min_by {|k,v| v}
    non_trivial = enumerable_usage.reject {|k,v| TRIVIAL_METHODS.member? k }
    ratio = 100.0 * each_count / (each_count + enumerable_count)
    non_trivial_ratio = 100.0 * each_count / (each_count + non_trivial.values.reduce(&:+))
    puts "#each count: #{each_count}"
    puts "Enumerable method usage: #{enumerable_count}"
    puts "Each ratio (lower is better): #{ratio.round(2)}%"
    puts "Non-trivial each ratio: #{non_trivial_ratio.round(2)}%"
    puts "Most Used: #{most_common[0]} / #{most_common[1]} times"
    puts "Least Used: #{least_common[0]} / #{least_common[1]} times"
    puts "Used once: #{enumerable_usage.select{|k,v| v == 1}.map{|k,v| k}}"
  4. @l15n l15n created this gist Jun 28, 2012.
    42 changes: 42 additions & 0 deletions enumetric.rb
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,42 @@
    #! /usr/bin/env ruby
    #
    # enumetric.rb
    #
    # Rough estimate of usage/non-usage of Enumerable methods
    def count_usage(method, dir = '.')
    method_delimiter = '[\s\.\{\(=]'
    method = method.to_s.sub('?','\?')
    cmd = "ack --no-group --ruby \"#{method}#{method_delimiter}\" #{dir}"
    IO.popen(cmd).count
    end

    def measure_enumerable_usage(dir = '.')
    Enumerable.instance_methods.each_with_object({}) { |m, set|
    set[m] = count_usage(m, dir)
    }
    end

    def tally_enumetric(dir = '.')
    each_count = count_usage('each', dir)
    enumerable_usage = measure_enumerable_usage(dir)
    enumerable_count = enumerable_usage.values.reduce(&:+)
    most_common = enumerable_usage.max_by {|k,v| v}
    least_common = enumerable_usage.reject{|k,v| v.zero?}.min_by {|k,v| v}
    ratio = 100.0 * each_count / (each_count + enumerable_count)
    puts "#each count: #{each_count}"
    puts "Enumerable method usage: #{enumerable_count}"
    puts "Each ratio (lower is better): #{ratio.round(2)}%"
    puts "Most Used: #{most_common[0]} / #{most_common[1]} times"
    puts "Least Used: #{least_common[0]} / #{least_common[1]} times"
    puts "Used once: #{enumerable_usage.select{|k,v| v == 1}.map{|k,v| k}}"
    puts "Never used: #{enumerable_usage.select{|k,v| v.zero?}.map{|k,v| k}}"
    puts "All usage: #{enumerable_usage.sort_by {|k,v| v}.map{|k,v| "#{k}: #{v}"}}"
    end

    if __FILE__ == $0
    if dir = ARGV[0]
    tally_enumetric(dir)
    else
    tally_enumetric
    end
    end