From de0e7507de826bf77fd57cc2a51e27388cb62ff7 Mon Sep 17 00:00:00 2001
From: David Heinemeier Hansson <david@loudthinking.com>
Date: Fri, 5 Sep 2008 14:22:10 +0200
Subject: Changed all benchmarking reports to be in milliseconds

---
 actionpack/CHANGELOG                               | 12 +++++
 actionpack/lib/action_controller/benchmarking.rb   | 60 +++++++++++++---------
 .../lib/action_view/helpers/benchmark_helper.rb    |  6 +--
 3 files changed, 51 insertions(+), 27 deletions(-)

(limited to 'actionpack')

diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index 88af60ed62..10ee29807d 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -1,5 +1,17 @@
 *Edge*
 
+* Changed the X-Runtime header to report in milliseconds [DHH]
+
+* Changed BenchmarkHelper#benchmark to report in milliseconds [DHH]
+
+* Changed logging format to be millisecond based and skip misleading stats [DHH]. Went from:
+
+    Completed in 0.10000 (4 reqs/sec) | Rendering: 0.40000 (40%) | DB: 0.04000 (4%) | 200 OK [http://example.com]
+
+  ...to:
+  
+    Completed in 100.00ms (View: 400.00, DB: 40.00) | 200 OK [http://example.com]
+
 * Add support for shallow nesting of routes. #838 [S. Brent Faulkner]
 
   Example :
diff --git a/actionpack/lib/action_controller/benchmarking.rb b/actionpack/lib/action_controller/benchmarking.rb
index 98b0325ba3..a2bd61889f 100644
--- a/actionpack/lib/action_controller/benchmarking.rb
+++ b/actionpack/lib/action_controller/benchmarking.rb
@@ -24,7 +24,7 @@ module ActionController #:nodoc:
         if logger && logger.level == log_level
           result = nil
           seconds = Benchmark.realtime { result = use_silence ? silence { yield } : yield }
-          logger.add(log_level, "#{title} (#{'%.5f' % seconds})")
+          logger.add(log_level, "#{title} (#{('%.2f' % (seconds * 1000))}ms)")
           result
         else
           yield
@@ -42,53 +42,65 @@ module ActionController #:nodoc:
 
     protected
       def render_with_benchmark(options = nil, extra_options = {}, &block)
-        unless logger
-          render_without_benchmark(options, extra_options, &block)
-        else
-          db_runtime = ActiveRecord::Base.connection.reset_runtime if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
+        if logger
+          if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
+            db_runtime = ActiveRecord::Base.connection.reset_runtime
+          end
 
           render_output = nil
-          @rendering_runtime = Benchmark::realtime{ render_output = render_without_benchmark(options, extra_options, &block) }
+          @view_runtime = Benchmark::realtime { render_output = render_without_benchmark(options, extra_options, &block) }
 
           if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
             @db_rt_before_render = db_runtime
             @db_rt_after_render = ActiveRecord::Base.connection.reset_runtime
-            @rendering_runtime -= @db_rt_after_render
+            @view_runtime -= @db_rt_after_render
           end
 
           render_output
+        else
+          render_without_benchmark(options, extra_options, &block)
         end
       end    
 
     private
       def perform_action_with_benchmark
-        unless logger
-          perform_action_without_benchmark
-        else
-          runtime = [ Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001 ].max
+        if logger
+          seconds = [ Benchmark::measure{ perform_action_without_benchmark }.real, 0.0001 ].max
+          logging_view          = defined?(@view_runtime)
+          logging_active_record = Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
+
+          log_message  = "Completed in #{sprintf("%.2f", seconds * 1000)}ms"
+
+          if logging_view || logging_active_record
+            log_message << " ("
+            log_message << view_runtime if logging_view
+
+            if logging_active_record
+              log_message << ", " + active_record_runtime + ")"
+            else
+              ")"
+            end
+          end
 
-          log_message  = "Completed in #{sprintf("%.5f", runtime)} (#{(1 / runtime).floor} reqs/sec)"
-          log_message << rendering_runtime(runtime) if defined?(@rendering_runtime)
-          log_message << active_record_runtime(runtime) if Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
           log_message << " | #{headers["Status"]}"
           log_message << " [#{complete_request_uri rescue "unknown"}]"
 
           logger.info(log_message)
-          response.headers["X-Runtime"] = sprintf("%.5f", runtime)
+          response.headers["X-Runtime"] = "#{sprintf("%.2f", seconds * 1000)}ms"
+        else
+          perform_action_without_benchmark
         end
       end
 
-      def rendering_runtime(runtime)
-        percentage = @rendering_runtime * 100 / runtime
-        " | Rendering: %.5f (%d%%)" % [@rendering_runtime, percentage.to_i]
+      def view_runtime
+        "View: %.2f" % (@view_runtime * 1000)
       end
 
-      def active_record_runtime(runtime)
-        db_runtime    = ActiveRecord::Base.connection.reset_runtime
-        db_runtime    += @db_rt_before_render if @db_rt_before_render
-        db_runtime    += @db_rt_after_render if @db_rt_after_render
-        db_percentage = db_runtime * 100 / runtime
-        " | DB: %.5f (%d%%)" % [db_runtime, db_percentage.to_i]
+      def active_record_runtime
+        db_runtime = ActiveRecord::Base.connection.reset_runtime
+        db_runtime += @db_rt_before_render if @db_rt_before_render
+        db_runtime += @db_rt_after_render if @db_rt_after_render
+        "DB: %.2f" % (db_runtime * 1000)
       end
   end
 end
diff --git a/actionpack/lib/action_view/helpers/benchmark_helper.rb b/actionpack/lib/action_view/helpers/benchmark_helper.rb
index 743d1d40ec..2401338896 100644
--- a/actionpack/lib/action_view/helpers/benchmark_helper.rb
+++ b/actionpack/lib/action_view/helpers/benchmark_helper.rb
@@ -15,15 +15,15 @@ module ActionView
       #    <%= expensive_files_operation %>
       #  <% end %>
       #
-      # That would add something like "Process data files (0.34523)" to the log,
+      # That would add something like "Process data files (345.23ms)" to the log,
       # which you can then use to compare timings when optimizing your code.
       #
       # You may give an optional logger level as the second argument
       # (:debug, :info, :warn, :error); the default value is :info.
       def benchmark(message = "Benchmarking", level = :info)
         if controller.logger
-          real = Benchmark.realtime { yield }
-          controller.logger.send(level, "#{message} (#{'%.5f' % real})")
+          seconds = Benchmark.realtime { yield }
+          controller.logger.send(level, "#{message} (#{'%.2f' % (seconds * 1000)}ms)")
         else
           yield
         end
-- 
cgit v1.2.3


From 227ee2ecb46f1609938a83ed82abde1a45ebe2eb Mon Sep 17 00:00:00 2001
From: David Heinemeier Hansson <david@loudthinking.com>
Date: Fri, 5 Sep 2008 14:58:34 +0200
Subject: Use a more sensible resolution on the new millisecond benchmarks

---
 actionpack/CHANGELOG                                   |  4 ++--
 actionpack/lib/action_controller/benchmarking.rb       | 10 +++++-----
 actionpack/lib/action_view/helpers/benchmark_helper.rb |  4 ++--
 3 files changed, 9 insertions(+), 9 deletions(-)

(limited to 'actionpack')

diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG
index 10ee29807d..cb61c8d2dd 100644
--- a/actionpack/CHANGELOG
+++ b/actionpack/CHANGELOG
@@ -6,11 +6,11 @@
 
 * Changed logging format to be millisecond based and skip misleading stats [DHH]. Went from:
 
-    Completed in 0.10000 (4 reqs/sec) | Rendering: 0.40000 (40%) | DB: 0.04000 (4%) | 200 OK [http://example.com]
+    Completed in 0.10000 (4 reqs/sec) | Rendering: 0.04000 (40%) | DB: 0.00400 (4%) | 200 OK [http://example.com]
 
   ...to:
   
-    Completed in 100.00ms (View: 400.00, DB: 40.00) | 200 OK [http://example.com]
+    Completed in 100ms (View: 40, DB: 4) | 200 OK [http://example.com]
 
 * Add support for shallow nesting of routes. #838 [S. Brent Faulkner]
 
diff --git a/actionpack/lib/action_controller/benchmarking.rb b/actionpack/lib/action_controller/benchmarking.rb
index a2bd61889f..746894497c 100644
--- a/actionpack/lib/action_controller/benchmarking.rb
+++ b/actionpack/lib/action_controller/benchmarking.rb
@@ -24,7 +24,7 @@ module ActionController #:nodoc:
         if logger && logger.level == log_level
           result = nil
           seconds = Benchmark.realtime { result = use_silence ? silence { yield } : yield }
-          logger.add(log_level, "#{title} (#{('%.2f' % (seconds * 1000))}ms)")
+          logger.add(log_level, "#{title} (#{('%.1f' % (seconds * 1000))}ms)")
           result
         else
           yield
@@ -69,7 +69,7 @@ module ActionController #:nodoc:
           logging_view          = defined?(@view_runtime)
           logging_active_record = Object.const_defined?("ActiveRecord") && ActiveRecord::Base.connected?
 
-          log_message  = "Completed in #{sprintf("%.2f", seconds * 1000)}ms"
+          log_message  = "Completed in #{sprintf("%.0f", seconds * 1000)}ms"
 
           if logging_view || logging_active_record
             log_message << " ("
@@ -86,21 +86,21 @@ module ActionController #:nodoc:
           log_message << " [#{complete_request_uri rescue "unknown"}]"
 
           logger.info(log_message)
-          response.headers["X-Runtime"] = "#{sprintf("%.2f", seconds * 1000)}ms"
+          response.headers["X-Runtime"] = "#{sprintf("%.0f", seconds * 1000)}ms"
         else
           perform_action_without_benchmark
         end
       end
 
       def view_runtime
-        "View: %.2f" % (@view_runtime * 1000)
+        "View: %.0f" % (@view_runtime * 1000)
       end
 
       def active_record_runtime
         db_runtime = ActiveRecord::Base.connection.reset_runtime
         db_runtime += @db_rt_before_render if @db_rt_before_render
         db_runtime += @db_rt_after_render if @db_rt_after_render
-        "DB: %.2f" % (db_runtime * 1000)
+        "DB: %.0f" % (db_runtime * 1000)
       end
   end
 end
diff --git a/actionpack/lib/action_view/helpers/benchmark_helper.rb b/actionpack/lib/action_view/helpers/benchmark_helper.rb
index 2401338896..bd72cda700 100644
--- a/actionpack/lib/action_view/helpers/benchmark_helper.rb
+++ b/actionpack/lib/action_view/helpers/benchmark_helper.rb
@@ -15,7 +15,7 @@ module ActionView
       #    <%= expensive_files_operation %>
       #  <% end %>
       #
-      # That would add something like "Process data files (345.23ms)" to the log,
+      # That would add something like "Process data files (345.2ms)" to the log,
       # which you can then use to compare timings when optimizing your code.
       #
       # You may give an optional logger level as the second argument
@@ -23,7 +23,7 @@ module ActionView
       def benchmark(message = "Benchmarking", level = :info)
         if controller.logger
           seconds = Benchmark.realtime { yield }
-          controller.logger.send(level, "#{message} (#{'%.2f' % (seconds * 1000)}ms)")
+          controller.logger.send(level, "#{message} (#{'%.1f' % (seconds * 1000)}ms)")
         else
           yield
         end
-- 
cgit v1.2.3