rubyperf 1.0.1 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/VERSION +1 -1
- data/lib/perf/meter.rb +60 -11
- data/lib/perf/meter_factory.rb +76 -6
- data/lib/perf/no_op_meter.rb +15 -5
- data/lib/perf/report_format.rb +1 -1
- data/rubyperf.gemspec +3 -4
- data/test/test_meter_factory.rb +68 -0
- data/test/test_perf_meter.rb +27 -23
- metadata +33 -27
    
        data/VERSION
    CHANGED
    
    | @@ -1 +1 @@ | |
| 1 | 
            -
            1.0 | 
| 1 | 
            +
            1.1.0
         | 
    
        data/lib/perf/meter.rb
    CHANGED
    
    | @@ -22,19 +22,48 @@ module Perf | |
| 22 22 | 
             
                attr_accessor :measurements
         | 
| 23 23 | 
             
                attr_accessor :current_path
         | 
| 24 24 |  | 
| 25 | 
            -
                 | 
| 25 | 
            +
                @@overhead = nil
         | 
| 26 | 
            +
             | 
| 27 | 
            +
                # Overhead calculation tuning constants
         | 
| 28 | 
            +
                OVERHEAD_CALC_MAX_REPETITIONS = 1000
         | 
| 29 | 
            +
                OVERHEAD_CALC_RUNS            = 100
         | 
| 30 | 
            +
                OVERHEAD_CALC_MIN_TIME        = 0.1
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                # Creation of a Perf::Meter allows you to specify if you want to consider the overhead in the calculation or not.
         | 
| 33 | 
            +
                # The overhead is calculated once and stored away. That way it is always the same in a single run.
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                def initialize(options={})
         | 
| 36 | 
            +
                  @options = options.clone
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                  @options[:subtract_overhead] = true if @options[:subtract_overhead].nil? # Never use ||= with booleans
         | 
| 39 | 
            +
             | 
| 26 40 | 
             
                  @measurements             = {}      # A hash of Measure
         | 
| 27 41 | 
             
                  @current_path             = nil
         | 
| 28 42 | 
             
                  @instrumented_methods     = {METHOD_TYPE_INSTANCE=>[],METHOD_TYPE_CLASS=>[]}
         | 
| 29 43 | 
             
                  @class_methods            = []
         | 
| 30 | 
            -
                   | 
| 31 | 
            -
                   | 
| 32 | 
            -
                  #  measure(:a) {}
         | 
| 33 | 
            -
                  #end
         | 
| 34 | 
            -
                  #@overhead = nil
         | 
| 44 | 
            +
                  @subtract_overhead        = @options[:subtract_overhead]
         | 
| 45 | 
            +
                  @@overhead              ||= measure_overhead  if @subtract_overhead
         | 
| 35 46 | 
             
                  @measurements             = {}      # A hash of Measure
         | 
| 36 47 | 
             
                end
         | 
| 37 48 |  | 
| 49 | 
            +
                def overhead
         | 
| 50 | 
            +
                  if @subtract_overhead
         | 
| 51 | 
            +
                    @@overhead.clone
         | 
| 52 | 
            +
                  else
         | 
| 53 | 
            +
                    Benchmark::Tms.new
         | 
| 54 | 
            +
                  end
         | 
| 55 | 
            +
                end
         | 
| 56 | 
            +
             | 
| 57 | 
            +
                # Returns the total time - expressed with a Benchmark::Tms object - for all the blocks measures
         | 
| 58 | 
            +
                def blocks_time
         | 
| 59 | 
            +
                  @measurements[PATH_MEASURES].time if @measurements[PATH_MEASURES]
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                # Returns the total time - expressed with a Benchmark::Tms object - for all the methods measures
         | 
| 63 | 
            +
                def methods_time
         | 
| 64 | 
            +
                  @measurements[PATH_METHODS].time if @measurements[PATH_METHODS]
         | 
| 65 | 
            +
                end
         | 
| 66 | 
            +
             | 
| 38 67 | 
             
                # Takes a description and a code block and measures the performance of the block.
         | 
| 39 68 | 
             
                # It returns the value returned by the block
         | 
| 40 69 | 
             
                #
         | 
| @@ -93,11 +122,11 @@ module Perf | |
| 93 122 | 
             
                      res=code.call
         | 
| 94 123 | 
             
                    else
         | 
| 95 124 | 
             
                      t = Benchmark.measure { res=code.call }
         | 
| 96 | 
            -
                       | 
| 97 | 
            -
                       | 
| 98 | 
            -
             | 
| 99 | 
            -
             | 
| 100 | 
            -
                       | 
| 125 | 
            +
                      t -= @@overhead if @subtract_overhead && @@overhead  # Factor out the overhead of measure, if we are asked to do so
         | 
| 126 | 
            +
                      if t.total>=0 && t.real>=0
         | 
| 127 | 
            +
                        m.time    += t
         | 
| 128 | 
            +
                        root.time += t if root
         | 
| 129 | 
            +
                      end
         | 
| 101 130 | 
             
                    end
         | 
| 102 131 | 
             
                  ensure
         | 
| 103 132 | 
             
                    @current_path=current_path
         | 
| @@ -273,6 +302,26 @@ module Perf | |
| 273 302 |  | 
| 274 303 | 
             
            protected
         | 
| 275 304 |  | 
| 305 | 
            +
                # This method measures the overhead of calling "measure" on an instace of Perf::Meter.
         | 
| 306 | 
            +
                # It will run OVERHEAD_CALC_RUNS measures of an empty block until the total time taken
         | 
| 307 | 
            +
                # exceeds OVERHEAD_CALC_MIN_TIME.
         | 
| 308 | 
            +
             | 
| 309 | 
            +
                def measure_overhead
         | 
| 310 | 
            +
                  t=Benchmark::Tms.new
         | 
| 311 | 
            +
                  cnt=0
         | 
| 312 | 
            +
                  rep=0
         | 
| 313 | 
            +
                  runs=OVERHEAD_CALC_RUNS
         | 
| 314 | 
            +
                  while t.total<OVERHEAD_CALC_MIN_TIME && rep<OVERHEAD_CALC_MAX_REPETITIONS
         | 
| 315 | 
            +
                    t+=Benchmark.measure do
         | 
| 316 | 
            +
                      runs.times {measure(:a) {}}
         | 
| 317 | 
            +
                    end
         | 
| 318 | 
            +
                    rep  += 1        # Count the repetitions
         | 
| 319 | 
            +
                    cnt  += runs     # Count the total runs
         | 
| 320 | 
            +
                    runs *= 2        # Increases the number of runs to quickly adapt to the speed of the machine
         | 
| 321 | 
            +
                  end
         | 
| 322 | 
            +
                  t/cnt
         | 
| 323 | 
            +
                end
         | 
| 324 | 
            +
             | 
| 276 325 | 
             
                def set_measurement(path,m)
         | 
| 277 326 | 
             
                  @measurements[path]=m  if m.is_a? Perf::Measure
         | 
| 278 327 | 
             
                end
         | 
    
        data/lib/perf/meter_factory.rb
    CHANGED
    
    | @@ -5,42 +5,112 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            module Perf
         | 
| 7 7 |  | 
| 8 | 
            -
              #  | 
| 8 | 
            +
              # Very simple Perf::Meter factory and singleton management.
         | 
| 9 | 
            +
              #
         | 
| 9 10 | 
             
              # Useful to not have to pass around Perf::Meter objects and still be able to generate stats in various parts of
         | 
| 10 | 
            -
              # the code.
         | 
| 11 | 
            +
              # the code. For complex situations where you have multiple Perf::Meter objects you might need to consider
         | 
| 12 | 
            +
              # either creating a factory that fulfills your needs, or create Perf::Meter objects and pass them around or use
         | 
| 13 | 
            +
              # this factory will well planned out key values so that you won't have conflicts and overrides.
         | 
| 14 | 
            +
              #
         | 
| 15 | 
            +
              # MeterFactory works keeping a global cache of Perf::Meter objects by key. Multiple independent parts
         | 
| 16 | 
            +
              # of your code using this factory could get into trouble and trample on each other if they use the same key, or the
         | 
| 17 | 
            +
              # default key.
         | 
| 18 | 
            +
              #
         | 
| 19 | 
            +
              # Example of usage where it would be inconvenient to pass around the Perf::Meter object from example to function2:
         | 
| 20 | 
            +
              #
         | 
| 21 | 
            +
              # def example
         | 
| 22 | 
            +
              #   Perf::MeterFactory.get.measure(:function1)
         | 
| 23 | 
            +
              #     function1()
         | 
| 24 | 
            +
              #   end
         | 
| 25 | 
            +
              # end
         | 
| 26 | 
            +
              #
         | 
| 27 | 
            +
              # def function1()
         | 
| 28 | 
            +
              #    ..
         | 
| 29 | 
            +
              #    function2()
         | 
| 30 | 
            +
              #    ..
         | 
| 31 | 
            +
              # end
         | 
| 32 | 
            +
              #
         | 
| 33 | 
            +
              # def function2()
         | 
| 34 | 
            +
              #   ..
         | 
| 35 | 
            +
              #   Perf::MeterFactory.get.measure(:some_hot_code_in_function2)
         | 
| 36 | 
            +
              #     ...
         | 
| 37 | 
            +
              #   end
         | 
| 38 | 
            +
              #   ..
         | 
| 39 | 
            +
              # end
         | 
| 40 | 
            +
              #
         | 
| 11 41 |  | 
| 12 42 | 
             
              class MeterFactory
         | 
| 13 43 |  | 
| 14 44 | 
             
                DEFAULT_METER = :default
         | 
| 15 45 |  | 
| 16 | 
            -
                @@perf_meters=nil
         | 
| 46 | 
            +
                @@perf_meters       = nil
         | 
| 47 | 
            +
                @@new_meter_options = {}
         | 
| 48 | 
            +
                @@factory_options   = {:noop=>false}
         | 
| 17 49 |  | 
| 18 | 
            -
                # Returns a Perf::Meter with a given key, and creates it  | 
| 19 | 
            -
                 | 
| 50 | 
            +
                # Returns a Perf::Meter with a given key, and creates it lazily if it doesn't exist'.
         | 
| 51 | 
            +
                # NOTE: The options are set ONLY the first time that get is called on a specific key.
         | 
| 52 | 
            +
                #       After that the options will be ignored!
         | 
| 53 | 
            +
             | 
| 54 | 
            +
                def self.get(key=DEFAULT_METER,new_meter_options=nil)
         | 
| 20 55 | 
             
                  @@perf_meters ||= {}
         | 
| 21 | 
            -
                   | 
| 56 | 
            +
                  if !@@factory_options[:noop]
         | 
| 57 | 
            +
                    # Creates a real meter
         | 
| 58 | 
            +
                    @@perf_meters[key] ||= Perf::Meter.new(new_meter_options || @@new_meter_options)
         | 
| 59 | 
            +
                  else
         | 
| 60 | 
            +
                    # If noop is set, creates a no-nop version of the meter, unless a meter with this key has already been
         | 
| 61 | 
            +
                    # created.
         | 
| 62 | 
            +
                    @@perf_meters[key] ||= Perf::NoOpMeter.new
         | 
| 63 | 
            +
                  end
         | 
| 64 | 
            +
                end
         | 
| 65 | 
            +
             | 
| 66 | 
            +
                # To set options for new meters created by get, when specific options are not passed, you can do so with this
         | 
| 67 | 
            +
                # method.
         | 
| 68 | 
            +
             | 
| 69 | 
            +
                def self.set_new_meters_options(options)
         | 
| 70 | 
            +
                  @@new_meter_options.merge(options)
         | 
| 71 | 
            +
                end
         | 
| 72 | 
            +
             | 
| 73 | 
            +
                # Set options for the factory behaviour.
         | 
| 74 | 
            +
             | 
| 75 | 
            +
                def self.set_factory_options(options)
         | 
| 76 | 
            +
                  @@factory_options.merge!(options)
         | 
| 77 | 
            +
                end
         | 
| 78 | 
            +
             | 
| 79 | 
            +
                # If you use set_new_meters_options, or if you pass options to Perf::MeterFactory.get, you are setting options
         | 
| 80 | 
            +
                # only for if the meter is created. For this reason you might need to find out if the meter already exist.
         | 
| 81 | 
            +
             | 
| 82 | 
            +
                def exists?(key=DEFAULT_METER)
         | 
| 83 | 
            +
                  !@@perf_meters[key].nil?
         | 
| 22 84 | 
             
                end
         | 
| 23 85 |  | 
| 24 86 | 
             
                # Pushes a Perf::Meter into a key
         | 
| 87 | 
            +
             | 
| 25 88 | 
             
                def self.set_meter(key,meter)
         | 
| 26 89 | 
             
                  @@perf_meters ||= {}
         | 
| 27 90 | 
             
                  @@perf_meters[key]=meter
         | 
| 28 91 | 
             
                end
         | 
| 29 92 |  | 
| 30 93 | 
             
                # Sets the default meter.
         | 
| 94 | 
            +
             | 
| 31 95 | 
             
                def self.set_default(meter)
         | 
| 32 96 | 
             
                  set_meter(DEFAULT_METER,meter)
         | 
| 33 97 | 
             
                end
         | 
| 34 98 |  | 
| 99 | 
            +
                # Returns a hash of existing meters.
         | 
| 100 | 
            +
             | 
| 35 101 | 
             
                def self.all
         | 
| 36 102 | 
             
                  @@perf_meters ||= {}
         | 
| 37 103 | 
             
                  return @@perf_meters.clone
         | 
| 38 104 | 
             
                end
         | 
| 39 105 |  | 
| 106 | 
            +
                # Removes an existing meter from the cache
         | 
| 107 | 
            +
             | 
| 40 108 | 
             
                def self.clear_meter(key=DEFAULT_METER)
         | 
| 41 109 | 
             
                  @@perf_meters.delete(key) if @@perf_meters
         | 
| 42 110 | 
             
                end
         | 
| 43 111 |  | 
| 112 | 
            +
                # Clears the entire cache of meters.
         | 
| 113 | 
            +
             | 
| 44 114 | 
             
                def self.clear_all!
         | 
| 45 115 | 
             
                  @@perf_meters=nil
         | 
| 46 116 | 
             
                end
         | 
    
        data/lib/perf/no_op_meter.rb
    CHANGED
    
    | @@ -12,7 +12,7 @@ module Perf | |
| 12 12 | 
             
              #
         | 
| 13 13 | 
             
              class NoOpMeter
         | 
| 14 14 |  | 
| 15 | 
            -
                def initialize( | 
| 15 | 
            +
                def initialize(options=nil)
         | 
| 16 16 | 
             
                end
         | 
| 17 17 |  | 
| 18 18 | 
             
                def clear
         | 
| @@ -33,7 +33,7 @@ module Perf | |
| 33 33 | 
             
                def measure_instance_method(klass,method_name)
         | 
| 34 34 | 
             
                end
         | 
| 35 35 |  | 
| 36 | 
            -
                def  | 
| 36 | 
            +
                def restore_instance_method(klass,method_name)
         | 
| 37 37 | 
             
                end
         | 
| 38 38 |  | 
| 39 39 | 
             
                def restore_all_instance_methods(klass)
         | 
| @@ -51,14 +51,24 @@ module Perf | |
| 51 51 | 
             
                def restore_all_methods(klass)
         | 
| 52 52 | 
             
                end
         | 
| 53 53 |  | 
| 54 | 
            -
                def  | 
| 55 | 
            -
                   | 
| 54 | 
            +
                def overhead
         | 
| 55 | 
            +
                  Benchmark::Tms.new
         | 
| 56 | 
            +
                end
         | 
| 57 | 
            +
             | 
| 58 | 
            +
                # Returns the total time - expressed with a Benchmark::Tms object - for all the blocks measures
         | 
| 59 | 
            +
                def blocks_time
         | 
| 60 | 
            +
                  Benchmark::Tms.new
         | 
| 61 | 
            +
                end
         | 
| 62 | 
            +
             | 
| 63 | 
            +
                # Returns the total time - expressed with a Benchmark::Tms object - for all the methods measures
         | 
| 64 | 
            +
                def methods_time
         | 
| 65 | 
            +
                  Benchmark::Tms.new
         | 
| 56 66 | 
             
                end
         | 
| 57 67 |  | 
| 58 68 | 
             
                def method_missing(method_sym, *arguments, &block)
         | 
| 59 69 | 
             
                  if method_sym.to_s =~ /^report_(.*)$/
         | 
| 60 70 | 
             
                    klass=Object.const_get("Perf").const_get("ReportFormat#{$1.capitalize}")
         | 
| 61 | 
            -
                    return  | 
| 71 | 
            +
                    return nil if klass
         | 
| 62 72 | 
             
                  end
         | 
| 63 73 | 
             
                  super
         | 
| 64 74 | 
             
                end
         | 
    
        data/lib/perf/report_format.rb
    CHANGED
    
    | @@ -62,7 +62,7 @@ module Perf | |
| 62 62 | 
             
                  end
         | 
| 63 63 |  | 
| 64 64 | 
             
                  # Header
         | 
| 65 | 
            -
                  rep << format_header(:title      => "measure | 
| 65 | 
            +
                  rep << format_header(:title      => "measure",      :max_title  => max_title,
         | 
| 66 66 | 
             
                                       :percent    => "percent",
         | 
| 67 67 | 
             
                                       :count      => "count",        :max_count  => max_count,
         | 
| 68 68 | 
             
                                       :time       => Benchmark::Tms::CAPTION,
         | 
    
        data/rubyperf.gemspec
    CHANGED
    
    | @@ -5,7 +5,7 @@ | |
| 5 5 |  | 
| 6 6 | 
             
            Gem::Specification.new do |s|
         | 
| 7 7 | 
             
              s.name = %q{rubyperf}
         | 
| 8 | 
            -
              s.version = "1.0 | 
| 8 | 
            +
              s.version = "1.1.0"
         | 
| 9 9 |  | 
| 10 10 | 
             
              s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
         | 
| 11 11 | 
             
              s.authors = ["lpasqualis"]
         | 
| @@ -43,14 +43,13 @@ Gem::Specification.new do |s| | |
| 43 43 | 
             
              s.homepage = %q{http://github.com/lpasqualis/rubyperf}
         | 
| 44 44 | 
             
              s.licenses = ["MIT"]
         | 
| 45 45 | 
             
              s.require_paths = ["lib"]
         | 
| 46 | 
            -
              s.rubygems_version = %q{1. | 
| 46 | 
            +
              s.rubygems_version = %q{1.4.2}
         | 
| 47 47 | 
             
              s.summary = %q{rubyperf helps you measure ruby code performance}
         | 
| 48 48 |  | 
| 49 49 | 
             
              if s.respond_to? :specification_version then
         | 
| 50 | 
            -
                current_version = Gem::Specification::CURRENT_SPECIFICATION_VERSION
         | 
| 51 50 | 
             
                s.specification_version = 3
         | 
| 52 51 |  | 
| 53 | 
            -
                if Gem::Version.new(Gem:: | 
| 52 | 
            +
                if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
         | 
| 54 53 | 
             
                  s.add_development_dependency(%q<shoulda>, [">= 0"])
         | 
| 55 54 | 
             
                  s.add_development_dependency(%q<bundler>, ["~> 1.0.0"])
         | 
| 56 55 | 
             
                  s.add_development_dependency(%q<jeweler>, ["~> 1.6.4"])
         | 
    
        data/test/test_meter_factory.rb
    CHANGED
    
    | @@ -14,6 +14,74 @@ require 'perf_test_example' | |
| 14 14 |  | 
| 15 15 | 
             
            class TestMeterFactory < Test::Unit::TestCase
         | 
| 16 16 |  | 
| 17 | 
            +
              def setup()
         | 
| 18 | 
            +
                Perf::MeterFactory.clear_all!
         | 
| 19 | 
            +
              end
         | 
| 20 | 
            +
             | 
| 21 | 
            +
              def teardown()
         | 
| 22 | 
            +
                Perf::MeterFactory.clear_all!
         | 
| 23 | 
            +
                Perf::MeterFactory.set_factory_options(:noop=>false)
         | 
| 24 | 
            +
              end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
              def test_noop
         | 
| 27 | 
            +
                Perf::MeterFactory.set_factory_options(:noop=>true)
         | 
| 28 | 
            +
                m1=Perf::MeterFactory.get()
         | 
| 29 | 
            +
                assert m1.is_a? Perf::NoOpMeter
         | 
| 30 | 
            +
                m1.measure(:something) do
         | 
| 31 | 
            +
                  # ...
         | 
| 32 | 
            +
                end
         | 
| 33 | 
            +
                assert m1.report_simple.nil?
         | 
| 34 | 
            +
              end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
              def test_noop2
         | 
| 37 | 
            +
                Perf::MeterFactory.set_factory_options(:noop=>true)
         | 
| 38 | 
            +
                m=Perf::MeterFactory.get()
         | 
| 39 | 
            +
                assert m.is_a? Perf::NoOpMeter
         | 
| 40 | 
            +
                m.measure(:string_operations) do
         | 
| 41 | 
            +
                  m.measure(:ciao) do
         | 
| 42 | 
            +
                    10.times do; "CIAO"*100; end
         | 
| 43 | 
            +
                  end
         | 
| 44 | 
            +
                end
         | 
| 45 | 
            +
                m.measure(:string_operations) do
         | 
| 46 | 
            +
                  m.measure(:help) do
         | 
| 47 | 
            +
                    10.times do; "HELP"*100; end
         | 
| 48 | 
            +
                  end
         | 
| 49 | 
            +
                end
         | 
| 50 | 
            +
                m.measure(:emtpy_loop) do
         | 
| 51 | 
            +
                  500.times do; end;
         | 
| 52 | 
            +
                end
         | 
| 53 | 
            +
                m.measure(:rough_overhead_x10000) do
         | 
| 54 | 
            +
                  10.times do
         | 
| 55 | 
            +
                    m.measure(:block_1) do
         | 
| 56 | 
            +
                      m.measure(:block_1_1) do
         | 
| 57 | 
            +
                      end
         | 
| 58 | 
            +
                      m.measure(:block_1_2) do
         | 
| 59 | 
            +
                        m.measure(:block_1_2_1) do
         | 
| 60 | 
            +
                        end
         | 
| 61 | 
            +
                        m.measure(:block_1_2_2) do
         | 
| 62 | 
            +
                        end
         | 
| 63 | 
            +
                        m.measure(:block_1_2_3) do
         | 
| 64 | 
            +
                          assert_equal false,m.measure_result(:bool_exp_1_2_3) { false }
         | 
| 65 | 
            +
                          m.measure_result(:bool_exp_1_2_3) { true }
         | 
| 66 | 
            +
                        end
         | 
| 67 | 
            +
                      end
         | 
| 68 | 
            +
                    end
         | 
| 69 | 
            +
                  end
         | 
| 70 | 
            +
                end
         | 
| 71 | 
            +
             | 
| 72 | 
            +
                m.measure(:empty) do
         | 
| 73 | 
            +
                end
         | 
| 74 | 
            +
                m.measure_result("test") { "something" }
         | 
| 75 | 
            +
                m.measure_result("test") { false }
         | 
| 76 | 
            +
                m.measure_result("test") { false }
         | 
| 77 | 
            +
             | 
| 78 | 
            +
                m.method_meters(Array,[:sort,:reverse],[:new]) do
         | 
| 79 | 
            +
                  Array.new(1000000,"abc").reverse.sort
         | 
| 80 | 
            +
                end
         | 
| 81 | 
            +
                assert_equal 123,m.measure(:blah) {123}
         | 
| 82 | 
            +
                assert m.report_simple.nil?
         | 
| 83 | 
            +
              end
         | 
| 84 | 
            +
             | 
| 17 85 | 
             
              def test_basic
         | 
| 18 86 | 
             
                Perf::MeterFactory.clear_all!
         | 
| 19 87 | 
             
                m1=Perf::MeterFactory.get()
         | 
    
        data/test/test_perf_meter.rb
    CHANGED
    
    | @@ -107,25 +107,8 @@ class TestPerfMeter < Test::Unit::TestCase | |
| 107 107 | 
             
                assert PerfTestExample.methods.sort     == cmethods
         | 
| 108 108 | 
             
                assert PerfTestExample.new.methods.sort == imethods
         | 
| 109 109 |  | 
| 110 | 
            -
                assert_equal ['\methods,0',
         | 
| 111 | 
            -
                              '\methods\#<Class:PerfTestExample>.static_method,1',
         | 
| 112 | 
            -
                              '\methods\PerfTestExample.test,1',
         | 
| 113 | 
            -
                              '\methods\PerfTestExample.test_np,1'],
         | 
| 114 | 
            -
                             m.report_list_of_measures
         | 
| 115 | 
            -
             | 
| 116 110 | 
             
                assert_equal 6,m.report_simple.length
         | 
| 117 111 | 
             
                assert_equal 6,m.report_html.length
         | 
| 118 | 
            -
              end
         | 
| 119 | 
            -
             | 
| 120 | 
            -
              def test_method_metering
         | 
| 121 | 
            -
                m=Perf::Meter.new
         | 
| 122 | 
            -
                m.method_meters(PerfTestExample,[:test,:test_np],[:static_method]) do
         | 
| 123 | 
            -
                  a=PerfTestExample.new
         | 
| 124 | 
            -
                  a.test(1,2,3)
         | 
| 125 | 
            -
                  a.test_np
         | 
| 126 | 
            -
                  PerfTestExample.static_method
         | 
| 127 | 
            -
                end
         | 
| 128 | 
            -
             | 
| 129 112 | 
             
                assert_equal ['\methods,0',
         | 
| 130 113 | 
             
                              '\methods\#<Class:PerfTestExample>.static_method,1',
         | 
| 131 114 | 
             
                              '\methods\PerfTestExample.test,1',
         | 
| @@ -285,13 +268,34 @@ class TestPerfMeter < Test::Unit::TestCase | |
| 285 268 | 
             
              def test_overhead
         | 
| 286 269 | 
             
                runs=1_000
         | 
| 287 270 | 
             
                a=(1..100_000).to_a
         | 
| 288 | 
            -
                 | 
| 289 | 
            -
                 | 
| 290 | 
            -
                 | 
| 271 | 
            +
                m_no_overhead=Perf::Meter.new(:subtract_overhead=>true)
         | 
| 272 | 
            +
                b1_no_overhead=Benchmark.measure { runs.times { m_no_overhead.measure(:a) { a.reverse! } } }
         | 
| 273 | 
            +
                b2_no_overhead=Benchmark.measure { runs.times { a.reverse!                 } }
         | 
| 274 | 
            +
             | 
| 275 | 
            +
                m_yes_overhead=Perf::Meter.new(:subtract_overhead=>false)
         | 
| 276 | 
            +
                b1_yes_overhead=Benchmark.measure { runs.times { m_yes_overhead.measure(:a) { a.reverse! } } }
         | 
| 277 | 
            +
                b2_yes_overhead=Benchmark.measure { runs.times { a.reverse!                 } }
         | 
| 278 | 
            +
             | 
| 279 | 
            +
             | 
| 291 280 | 
             
                assert_equal  ['\blocks,0',
         | 
| 292 281 | 
             
                               '\blocks\a,1000'],
         | 
| 293 | 
            -
                               | 
| 294 | 
            -
             | 
| 295 | 
            -
                 | 
| 282 | 
            +
                              m_no_overhead.report_list_of_measures
         | 
| 283 | 
            +
             | 
| 284 | 
            +
                assert_equal  m_no_overhead.report_list_of_measures,
         | 
| 285 | 
            +
                              m_yes_overhead.report_list_of_measures
         | 
| 286 | 
            +
             | 
| 287 | 
            +
                # TODO: find the magic assert that ensures that the overhead calculation is correct. Ensure that such assert
         | 
| 288 | 
            +
                #       is machine independent and that will pass the test of time (new hardware getting faster and faster)
         | 
| 289 | 
            +
             | 
| 290 | 
            +
                #calculated_overhead_1= (b1_no_overhead-b2_no_overhead)/runs
         | 
| 291 | 
            +
                #calculated_overhead_2= (b1_yes_overhead-b2_yes_overhead)/runs
         | 
| 292 | 
            +
                #
         | 
| 293 | 
            +
                #puts (calculated_overhead_1-m_no_overhead.overhead)
         | 
| 294 | 
            +
                #puts (calculated_overhead_2-m_yes_overhead.overhead)
         | 
| 295 | 
            +
                #
         | 
| 296 | 
            +
                #puts m_no_overhead.report_simple
         | 
| 297 | 
            +
                #puts m_yes_overhead.report_simple
         | 
| 298 | 
            +
                #
         | 
| 299 | 
            +
                #assert m_no_overhead.blocks_time.total > m_yes_overhead.blocks_time.total
         | 
| 296 300 | 
             
              end
         | 
| 297 301 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,13 +1,13 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification 
         | 
| 2 2 | 
             
            name: rubyperf
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version 
         | 
| 4 | 
            -
               | 
| 4 | 
            +
              hash: 19
         | 
| 5 | 
            +
              prerelease: 
         | 
| 5 6 | 
             
              segments: 
         | 
| 6 7 | 
             
              - 1
         | 
| 7 | 
            -
              - 0
         | 
| 8 8 | 
             
              - 1
         | 
| 9 | 
            -
               | 
| 10 | 
            -
              version: 1.0 | 
| 9 | 
            +
              - 0
         | 
| 10 | 
            +
              version: 1.1.0
         | 
| 11 11 | 
             
            platform: ruby
         | 
| 12 12 | 
             
            authors: 
         | 
| 13 13 | 
             
            - lpasqualis
         | 
| @@ -20,60 +20,64 @@ default_executable: | |
| 20 20 | 
             
            dependencies: 
         | 
| 21 21 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 22 22 | 
             
              prerelease: false
         | 
| 23 | 
            -
               | 
| 24 | 
            -
             | 
| 25 | 
            -
              version_requirements: &id001 !ruby/object:Gem::Requirement 
         | 
| 23 | 
            +
              requirement: &id001 !ruby/object:Gem::Requirement 
         | 
| 24 | 
            +
                none: false
         | 
| 26 25 | 
             
                requirements: 
         | 
| 27 26 | 
             
                - - ">="
         | 
| 28 27 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 28 | 
            +
                    hash: 3
         | 
| 29 29 | 
             
                    segments: 
         | 
| 30 30 | 
             
                    - 0
         | 
| 31 | 
            -
                    segments_generated: true
         | 
| 32 31 | 
             
                    version: "0"
         | 
| 33 | 
            -
               | 
| 32 | 
            +
              type: :development
         | 
| 33 | 
            +
              name: shoulda
         | 
| 34 | 
            +
              version_requirements: *id001
         | 
| 34 35 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 35 36 | 
             
              prerelease: false
         | 
| 36 | 
            -
               | 
| 37 | 
            -
             | 
| 38 | 
            -
              version_requirements: &id002 !ruby/object:Gem::Requirement 
         | 
| 37 | 
            +
              requirement: &id002 !ruby/object:Gem::Requirement 
         | 
| 38 | 
            +
                none: false
         | 
| 39 39 | 
             
                requirements: 
         | 
| 40 40 | 
             
                - - ~>
         | 
| 41 41 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 42 | 
            +
                    hash: 23
         | 
| 42 43 | 
             
                    segments: 
         | 
| 43 44 | 
             
                    - 1
         | 
| 44 45 | 
             
                    - 0
         | 
| 45 46 | 
             
                    - 0
         | 
| 46 | 
            -
                    segments_generated: true
         | 
| 47 47 | 
             
                    version: 1.0.0
         | 
| 48 | 
            -
               | 
| 48 | 
            +
              type: :development
         | 
| 49 | 
            +
              name: bundler
         | 
| 50 | 
            +
              version_requirements: *id002
         | 
| 49 51 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 50 52 | 
             
              prerelease: false
         | 
| 51 | 
            -
               | 
| 52 | 
            -
             | 
| 53 | 
            -
              version_requirements: &id003 !ruby/object:Gem::Requirement 
         | 
| 53 | 
            +
              requirement: &id003 !ruby/object:Gem::Requirement 
         | 
| 54 | 
            +
                none: false
         | 
| 54 55 | 
             
                requirements: 
         | 
| 55 56 | 
             
                - - ~>
         | 
| 56 57 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 58 | 
            +
                    hash: 7
         | 
| 57 59 | 
             
                    segments: 
         | 
| 58 60 | 
             
                    - 1
         | 
| 59 61 | 
             
                    - 6
         | 
| 60 62 | 
             
                    - 4
         | 
| 61 | 
            -
                    segments_generated: true
         | 
| 62 63 | 
             
                    version: 1.6.4
         | 
| 63 | 
            -
               | 
| 64 | 
            +
              type: :development
         | 
| 65 | 
            +
              name: jeweler
         | 
| 66 | 
            +
              version_requirements: *id003
         | 
| 64 67 | 
             
            - !ruby/object:Gem::Dependency 
         | 
| 65 68 | 
             
              prerelease: false
         | 
| 66 | 
            -
               | 
| 67 | 
            -
             | 
| 68 | 
            -
              version_requirements: &id004 !ruby/object:Gem::Requirement 
         | 
| 69 | 
            +
              requirement: &id004 !ruby/object:Gem::Requirement 
         | 
| 70 | 
            +
                none: false
         | 
| 69 71 | 
             
                requirements: 
         | 
| 70 72 | 
             
                - - ">="
         | 
| 71 73 | 
             
                  - !ruby/object:Gem::Version 
         | 
| 74 | 
            +
                    hash: 3
         | 
| 72 75 | 
             
                    segments: 
         | 
| 73 76 | 
             
                    - 0
         | 
| 74 | 
            -
                    segments_generated: true
         | 
| 75 77 | 
             
                    version: "0"
         | 
| 76 | 
            -
               | 
| 78 | 
            +
              type: :development
         | 
| 79 | 
            +
              name: rcov
         | 
| 80 | 
            +
              version_requirements: *id004
         | 
| 77 81 | 
             
            description: Used to easily measure the performance of blocks of Ruby code, expressions and methods; provides reporting in various formats
         | 
| 78 82 | 
             
            email: lpasqualis@gmail.com
         | 
| 79 83 | 
             
            executables: []
         | 
| @@ -116,25 +120,27 @@ rdoc_options: [] | |
| 116 120 | 
             
            require_paths: 
         | 
| 117 121 | 
             
            - lib
         | 
| 118 122 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement 
         | 
| 123 | 
            +
              none: false
         | 
| 119 124 | 
             
              requirements: 
         | 
| 120 125 | 
             
              - - ">="
         | 
| 121 126 | 
             
                - !ruby/object:Gem::Version 
         | 
| 127 | 
            +
                  hash: 3
         | 
| 122 128 | 
             
                  segments: 
         | 
| 123 129 | 
             
                  - 0
         | 
| 124 | 
            -
                  segments_generated: true
         | 
| 125 130 | 
             
                  version: "0"
         | 
| 126 131 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement 
         | 
| 132 | 
            +
              none: false
         | 
| 127 133 | 
             
              requirements: 
         | 
| 128 134 | 
             
              - - ">="
         | 
| 129 135 | 
             
                - !ruby/object:Gem::Version 
         | 
| 136 | 
            +
                  hash: 3
         | 
| 130 137 | 
             
                  segments: 
         | 
| 131 138 | 
             
                  - 0
         | 
| 132 | 
            -
                  segments_generated: true
         | 
| 133 139 | 
             
                  version: "0"
         | 
| 134 140 | 
             
            requirements: []
         | 
| 135 141 |  | 
| 136 142 | 
             
            rubyforge_project: 
         | 
| 137 | 
            -
            rubygems_version: 1. | 
| 143 | 
            +
            rubygems_version: 1.4.2
         | 
| 138 144 | 
             
            signing_key: 
         | 
| 139 145 | 
             
            specification_version: 3
         | 
| 140 146 | 
             
            summary: rubyperf helps you measure ruby code performance
         |