Hatena::Groupsubtech

#生存戦略 、それは

-> 06 { 08 / 12 }

benchmark/runner.rb

09:58 | はてなブックマーク - benchmark/runner.rb - #生存戦略 、それは

ちょっと書き直した

#!/usr/bin/env ruby

require 'benchmark'

module Benchmark
  class Runner
    def setup; end

    def teardown; end

    def __run(n)
      methods = self.class.bm_methods
      unless methods.empty?
        ::Benchmark.bm( methods.map{|c| c.length}.max ) do |bench|
          methods.each do |method|
            setup
            bench.report(method) do
              n.times { self.__send__(method) }
            end
            teardown
          end
        end

      end
    end

    def self.bm(times = 1)
      self.new.__run times
    end

    class << self
      alias_method 'benchmark', 'bm'
      alias_method 'run', 'bm'
    end

    private
    def self.bm_methods
      self.self_methods.reject {|m| m[0..0] == '_' }
    end

    def self.self_methods
      self.instance_methods - self.superclass.instance_methods
    end
  end
end

if __FILE__ == $0 && File.exist?(ARGV[0].to_s)
  load ARGV[0]
  times = ARGV[1]
  times = 1 if times <= 0
  ObjectSpace.each_object(Class) do |klass|
    klass.bm if klass < Benchmark::Runner
  end
end

__END__
# example

class FooBench < Benchmark::Runner
  def setup
    @repeat_times = 100000
  end

  def each_without_arg
    n = 0
    (1..@repeat_times).each { n += 1 }
  end

  def each
    n = 0
    (1..@repeat_times).each {|i| n += 1 }
  end

  def times
    n = 0
    @repeat_times.times { n += 1 }
  end

  def inject
    (1..@repeat_times).inject(0) {|n,| n + 1 }
  end

end

FooBench.run(10)

lurkerlurker2006/08/12 12:54>javascript スキーム(って云うの?) でロードかぁ
この間ソース読んだのですが、
Firebugもこの実装だった気がします。

secondlifesecondlife2006/08/12 12:59結構ストレートな実装方法なんですね