GitHub Sale: sign up for any paid plan this week and pay nothing until January 1, 2009!  [ hide ]

public
Description: Ruby on Rails
Homepage: http://rubyonrails.org
Clone URL: git://github.com/rails/rails.git
Changed all benchmarking reports to be in milliseconds
dhh (author)
Fri Sep 05 05:22:10 -0700 2008
commit  de0e7507de826bf77fd57cc2a51e27388cb62ff7
tree    60d923008716ef32943bb6caef4b6faf504a0970
parent  cf0467c6425a528acfe2cb14709253a8a4a99b37
...
1
2
 
 
 
 
 
 
 
 
 
 
 
 
3
4
5
...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
0
@@ -1,5 +1,17 @@
0
 *Edge*
0
 
0
+* Changed the X-Runtime header to report in milliseconds [DHH]
0
+
0
+* Changed BenchmarkHelper#benchmark to report in milliseconds [DHH]
0
+
0
+* Changed logging format to be millisecond based and skip misleading stats [DHH]. Went from:
0
+
0
+ Completed in 0.10000 (4 reqs/sec) | Rendering: 0.40000 (40%) | DB: 0.04000 (4%) | 200 OK [http://example.com]
0
+
0
+ ...to:
0
+
0
+ Completed in 100.00ms (View: 400.00, DB: 40.00) | 200 OK [http://example.com]
0
+
0
 * Add support for shallow nesting of routes. #838 [S. Brent Faulkner]
0
 
0
   Example :
...
24
25
26
27
 
28
29
30
...
42
43
44
45
46
47
48
 
 
 
 
49
50
51
 
52
53
54
55
56
 
57
58
59
 
 
60
61
62
63
64
65
66
67
68
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
70
71
72
73
74
75
76
77
 
 
 
78
79
80
81
82
83
 
 
84
85
86
87
88
89
90
91
 
 
 
 
 
92
93
94
...
24
25
26
 
27
28
29
30
...
42
43
44
 
 
 
 
45
46
47
48
49
50
 
51
52
53
54
55
 
56
57
58
59
60
61
62
63
64
65
66
 
 
 
 
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
 
 
85
86
87
88
 
89
90
91
92
93
94
 
 
 
95
96
97
98
 
 
 
 
 
 
99
100
101
102
103
104
105
106
0
@@ -24,7 +24,7 @@ module ActionController #:nodoc:
0
         if logger && logger.level == log_level
0
           result = nil
0
           seconds = Benchmark.realtime { result = use_silence ? silence { yield } : yield }
0
- logger.add(log_level, "#{title} (#{'%.5f' % seconds})")
0
+ logger.add(log_level, "#{title} (#{('%.2f' % (seconds * 1000))}ms)")
0
           result
0
         else
0
           yield
0
@@ -42,53 +42,65 @@ module ActionController #:nodoc:
0
 
0
     protected
0
       def render_with_benchmark(options = nil, extra_options = {}, &block)
0
- unless logger
0
- render_without_benchmark(options, extra_options, &block)
0
- else
0
- db_runtime = ActiveRecord::Base.connection.reset_runtime if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
0
+ if logger
0
+ if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
0
+ db_runtime = ActiveRecord::Base.connection.reset_runtime
0
+ end
0
 
0
           render_output = nil
0
- @rendering_runtime = Benchmark::realtime{ render_output = render_without_benchmark(options, extra_options, &block) }
0
+ @view_runtime = Benchmark::realtime { render_output = render_without_benchmark(options, extra_options, &block) }
0
 
0
           if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
0
             @db_rt_before_render = db_runtime
0
             @db_rt_after_render = ActiveRecord::Base.connection.reset_runtime
0
- @rendering_runtime -= @db_rt_after_render
0
+ @view_runtime -= @db_rt_after_render
0
           end
0
 
0
           render_output
0
+ else
0
+ render_without_benchmark(options, extra_options, &block)
0
         end
0
       end
0
 
0
     private
0
       def perform_action_with_benchmark
0
- unless logger
0
- perform_action_without_benchmark
0
- else
0
- runtime = [ Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001 ].max
0
+ if logger
0
+ seconds = [ Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001 ].max
0
+ logging_view = defined?(@view_runtime)
0
+ logging_active_record = Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
0
+
0
+ log_message = "Completed in #{sprintf("%.2f", seconds * 1000)}ms"
0
+
0
+ if logging_view || logging_active_record
0
+ log_message << " ("
0
+ log_message << view_runtime if logging_view
0
+
0
+ if logging_active_record
0
+ log_message << ", " + active_record_runtime + ")"
0
+ else
0
+ ")"
0
+ end
0
+ end
0
 
0
- log_message = "Completed in #{sprintf("%.5f", runtime)} (#{(1 / runtime).floor} reqs/sec)"
0
- log_message << rendering_runtime(runtime) if defined?(@rendering_runtime)
0
- log_message << active_record_runtime(runtime) if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
0
           log_message << " | #{headers["Status"]}"
0
           log_message << " [#{complete_request_uri rescue "unknown"}]"
0
 
0
           logger.info(log_message)
0
- response.headers["X-Runtime"] = sprintf("%.5f", runtime)
0
+ response.headers["X-Runtime"] = "#{sprintf("%.2f", seconds * 1000)}ms"
0
+ else
0
+ perform_action_without_benchmark
0
         end
0
       end
0
 
0
- def rendering_runtime(runtime)
0
- percentage = @rendering_runtime * 100 / runtime
0
- " | Rendering: %.5f (%d%%)" % [@rendering_runtime, percentage.to_i]
0
+ def view_runtime
0
+ "View: %.2f" % (@view_runtime * 1000)
0
       end
0
 
0
- def active_record_runtime(runtime)
0
- db_runtime = ActiveRecord::Base.connection.reset_runtime
0
- db_runtime += @db_rt_before_render if @db_rt_before_render
0
- db_runtime += @db_rt_after_render if @db_rt_after_render
0
- db_percentage = db_runtime * 100 / runtime
0
- " | DB: %.5f (%d%%)" % [db_runtime, db_percentage.to_i]
0
+ def active_record_runtime
0
+ db_runtime = ActiveRecord::Base.connection.reset_runtime
0
+ db_runtime += @db_rt_before_render if @db_rt_before_render
0
+ db_runtime += @db_rt_after_render if @db_rt_after_render
0
+ "DB: %.2f" % (db_runtime * 1000)
0
       end
0
   end
0
 end
...
15
16
17
18
 
19
20
21
22
23
24
25
26
 
 
27
28
29
...
15
16
17
 
18
19
20
21
22
23
24
 
 
25
26
27
28
29
0
@@ -15,15 +15,15 @@ module ActionView
0
       # <%= expensive_files_operation %>
0
       # <% end %>
0
       #
0
- # That would add something like "Process data files (0.34523)" to the log,
0
+ # That would add something like "Process data files (345.23ms)" to the log,
0
       # which you can then use to compare timings when optimizing your code.
0
       #
0
       # You may give an optional logger level as the second argument
0
       # (:debug, :info, :warn, :error); the default value is :info.
0
       def benchmark(message = "Benchmarking", level = :info)
0
         if controller.logger
0
- real = Benchmark.realtime { yield }
0
- controller.logger.send(level, "#{message} (#{'%.5f' % real})")
0
+ seconds = Benchmark.realtime { yield }
0
+ controller.logger.send(level, "#{message} (#{'%.2f' % (seconds * 1000)}ms)")
0
         else
0
           yield
0
         end
...
1
2
 
 
3
4
5
...
1
2
3
4
5
6
7
0
@@ -1,5 +1,7 @@
0
 *Edge*
0
 
0
+* Changed benchmarks to be reported in milliseconds [DHH]
0
+
0
 * Connection pooling. #936 [Nick Sieger]
0
 
0
 * Merge scoped :joins together instead of overwriting them. May expose scoping bugs in your code! #501 [Andrew White]
...
1313
1314
1315
1316
 
1317
1318
1319
...
1313
1314
1315
 
1316
1317
1318
1319
0
@@ -1313,7 +1313,7 @@ module ActiveRecord #:nodoc:
0
         if logger && logger.level <= log_level
0
           result = nil
0
           seconds = Benchmark.realtime { result = use_silence ? silence { yield } : yield }
0
- logger.add(log_level, "#{title} (#{'%.5f' % seconds})")
0
+ logger.add(log_level, "#{title} (#{'%.2f' % (seconds * 1000)}ms)")
0
           result
0
         else
0
           yield
...
147
148
149
150
 
151
152
153
 
 
154
155
156
...
147
148
149
 
150
151
 
 
152
153
154
155
156
0
@@ -147,10 +147,10 @@ module ActiveRecord
0
         @open_transactions -= 1
0
       end
0
 
0
- def log_info(sql, name, runtime)
0
+ def log_info(sql, name, seconds)
0
         if @logger && @logger.debug?
0
- name = "#{name.nil? ? "SQL" : name} (#{sprintf("%f", runtime)})"
0
- @logger.debug format_log_entry(name, sql.squeeze(' '))
0
+ name = "#{name.nil? ? "SQL" : name} (#{sprintf("%.2f", seconds * 1000)}ms)"
0
+ @logger.debug(format_log_entry(name, sql.squeeze(' ')))
0
         end
0
       end
0
 
...
1
2
 
 
3
4
5
...
1
2
3
4
5
6
7
0
@@ -1,5 +1,7 @@
0
 *Edge*
0
 
0
+* Changed cache benchmarking to be reported in milliseconds [DHH]
0
+
0
 * Fix Ruby's Time marshaling bug in pre-1.9 versions of Ruby: utc instances are now correctly unmarshaled with a utc zone instead of the system local zone [#900 state:resolved] [Luca Guidi, Geoff Buesing]
0
 
0
 * Add Array#in_groups which splits or iterates over the array in specified number of groups. #579. [Adrian Mugnolo] Example:
...
62
63
64
65
 
66
67
68
...
62
63
64
 
65
66
67
68
0
@@ -62,7 +62,7 @@ module ActiveSupport
0
           write(key, value, options)
0
           @logger_off = false
0
 
0
- log("write (will save #{'%.5f' % seconds})", key, nil)
0
+ log("write (will save #{'%.2f' % (seconds * 1000)}ms)", key, nil)
0
 
0
           value
0
         end

Comments