Class: ActionController::RequestProfiler

Inherits:
Object
  • Object
show all
Defined in:
lib/action_controller/request_profiler.rb

Defined Under Namespace

Classes: Sandbox

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(options = {}) ⇒ RequestProfiler

Returns a new instance of RequestProfiler.



75
76
77
# File 'lib/action_controller/request_profiler.rb', line 75

def initialize(options = {})
  @options = default_options.merge(options)
end

Instance Attribute Details

#optionsObject (readonly)

Returns the value of attribute options.



73
74
75
# File 'lib/action_controller/request_profiler.rb', line 73

def options
  @options
end

Class Method Details

.run(args = nil, options = {}) ⇒ Object



80
81
82
83
84
# File 'lib/action_controller/request_profiler.rb', line 80

def self.run(args = nil, options = {})
  profiler = new(options)
  profiler.parse_options(args) if args
  profiler.run
end

Instance Method Details

#benchmark(sandbox, profiling = false) ⇒ Object



108
109
110
111
112
113
# File 'lib/action_controller/request_profiler.rb', line 108

def benchmark(sandbox, profiling = false)
  sandbox.request_count = 0
  elapsed = sandbox.benchmark(options[:n], profiling).to_f
  count = sandbox.request_count.to_i
  puts '%.2f sec, %d requests, %d req/sec' % [elapsed, count, count / elapsed]
end

#default_optionsObject



119
120
121
# File 'lib/action_controller/request_profiler.rb', line 119

def default_options
  { :n => 100, :open => 'open %s &' }
end

#parse_options(args) ⇒ Object

Parse command-line options



124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# File 'lib/action_controller/request_profiler.rb', line 124

def parse_options(args)
  OptionParser.new do |opt|
    opt.banner = "USAGE: #{$0} [options] [session script path]"

    opt.on('-n', '--times [100]', 'How many requests to process. Defaults to 100.') { |v| options[:n] = v.to_i if v }
    opt.on('-b', '--benchmark', 'Benchmark instead of profiling') { |v| options[:benchmark] = v }
    opt.on('-m', '--measure [mode]', 'Which ruby-prof measure mode to use: process_time, wall_time, cpu_time, allocations, or memory. Defaults to process_time.') { |v| options[:measure] = v }
    opt.on('--open [CMD]', 'Command to open profile results. Defaults to "open %s &"') { |v| options[:open] = v }
    opt.on('-h', '--help', 'Show this help') { puts opt; exit }

    opt.parse args

    if args.empty?
      puts opt
      exit
    end
    options[:script] = args.pop
  end
end

#profile(sandbox) ⇒ Object



98
99
100
101
102
103
104
105
106
# File 'lib/action_controller/request_profiler.rb', line 98

def profile(sandbox)
  load_ruby_prof

  benchmark(sandbox, true)
  results = RubyProf.stop

  show_profile_results results
  results
end

#runObject



86
87
88
89
90
91
92
93
94
95
96
# File 'lib/action_controller/request_profiler.rb', line 86

def run
  sandbox = Sandbox.new(options[:script])

  puts 'Warming up once'

  elapsed = warmup(sandbox)
  puts '%.2f sec, %d requests, %d req/sec' % [elapsed, sandbox.request_count, sandbox.request_count / elapsed]
  puts "\n#{options[:benchmark] ? 'Benchmarking' : 'Profiling'} #{options[:n]}x"

  options[:benchmark] ? benchmark(sandbox) : profile(sandbox)
end

#warmup(sandbox) ⇒ Object



115
116
117
# File 'lib/action_controller/request_profiler.rb', line 115

def warmup(sandbox)
  Benchmark.realtime { sandbox.run(false) }
end