[Groonga-commit] droonga/http-benchmark at 91d36cc [master] Implement benchmark result as a class

Back to archive index

YUKI Hiroshi null+****@clear*****
Wed Oct 9 15:40:14 JST 2013


YUKI Hiroshi	2013-10-09 15:40:14 +0900 (Wed, 09 Oct 2013)

  New Revision: 91d36cc193f3e4019dfcb7a5cce57b9b18bda668
  https://github.com/droonga/http-benchmark/commit/91d36cc193f3e4019dfcb7a5cce57b9b18bda668

  Message:
    Implement benchmark result as a class

  Modified files:
    lib/droonga/http-benchmark/formatter.rb
    lib/droonga/http-benchmark/runner.rb

  Modified: lib/droonga/http-benchmark/formatter.rb (+0 -13)
===================================================================
--- lib/droonga/http-benchmark/formatter.rb    2013-10-08 10:50:24 +0900 (49f834d)
+++ lib/droonga/http-benchmark/formatter.rb    2013-10-09 15:40:14 +0900 (f4c3c50)
@@ -4,19 +4,6 @@ module Droonga
   module HttpBenchmark
     class Formatter
       class << self
-        def output_one_result(result)
-          puts "Total requests: #{result[:total_n_requests]} " +
-                 "(#{result[:queries_per_second]} queries per second)"
-          puts "Status:"
-          result[:responses].each do |status, percentage|
-            puts "  #{status}: #{percentage} %"
-          end
-          puts "Elapsed time:"
-          puts "  min:     #{result[:min_elapsed_time]} sec"
-          puts "  max:     #{result[:max_elapsed_time]} sec"
-          puts "  average: #{result[:average_elapsed_time]} sec"
-        end
-
         def output_gradual_results(results)
           http_statuses = []
           results.each do |n_clients, result|

  Modified: lib/droonga/http-benchmark/runner.rb (+97 -57)
===================================================================
--- lib/droonga/http-benchmark/runner.rb    2013-10-08 10:50:24 +0900 (b78afe8)
+++ lib/droonga/http-benchmark/runner.rb    2013-10-09 15:40:14 +0900 (b4921dc)
@@ -3,7 +3,6 @@
 require "thread"
 require "net/http"
 require "json"
-require "droonga/http-benchmark/formatter"
 
 module Droonga
   module HttpBenchmark
@@ -45,19 +44,18 @@ module Droonga
 
       def run
         process_requests
-        analyze_results
-        Formatter.output_one_result(@result)
+        puts****@resul*****_s
         @result
       end
 
       private
       def process_requests
         requests_queue = Queue.new
-        results_queue = Queue.new
+        @result = Result.new(:duration => @duration)
 
         @clients = @n_clients.times.collect do |index|
           client = Client.new(:requests => requests_queue,
-                              :results => results_queue,
+                              :result => @result,
                               :wait => @wait)
           client.run
           client
@@ -77,54 +75,7 @@ module Droonga
           client.stop
         end
 
-        @results = []
-        while not results_queue.empty?
-          @results << results_queue.pop
-        end
-      end
-
-      def analyze_results
-        total_n_requests =****@resul*****
-        http_statuses = {}
-        min_elapsed_time = @duration
-        max_elapsed_time = 0
-        total_elapsed_time = 0
-
-        @results.each do |result|
-          http_statuses[result[:status]] ||= 0
-          http_statuses[result[:status]] += 1
-
-          if result[:elapsed_time] < min_elapsed_time
-            min_elapsed_time = result[:elapsed_time]
-          end
-          if result[:elapsed_time] > max_elapsed_time
-            max_elapsed_time = result[:elapsed_time]
-          end
-          total_elapsed_time += result[:elapsed_time]
-        end
-
-        http_status_percentages = []
-        http_statuses.each do |status, n_results|
-          percentage = n_results.to_f / total_n_requests * 100
-          http_status_percentages << { :percentage => percentage,
-                                       :status => status }
-        end
-        http_status_percentages.sort! do |a, b|
-          (-1) * (a[:percentage] <=> b[:percentage])
-        end
-        sorted_http_statuses = {}
-        http_status_percentages.each do |status|
-          sorted_http_statuses[status[:status]] = status[:percentage]
-        end
-
-        @result = {
-          :total_n_requests => total_n_requests,
-          :queries_per_second => total_n_requests.to_f / @duration,
-          :responses => sorted_http_statuses,
-          :min_elapsed_time => min_elapsed_time,
-          :max_elapsed_time => max_elapsed_time,
-          :average_elapsed_time => total_elapsed_time / total_n_requests,
-        }
+        @result
       end
 
       def populate_requests
@@ -171,7 +122,7 @@ module Droonga
 
         def initialize(params)
           @requests = params[:requests]
-          @results = params[:results]
+          @result = params[:result]
           @wait = params[:wait]
         end
 
@@ -195,9 +146,11 @@ module Droonga
                   end
                   response = http.post(request[:path], body, header)
                 end
-                @results.push(:request => request,
-                              :status => response.code,
-                              :elapsed_time => Time.now - start_time)
+                @result << {
+                  :request => request,
+                  :status => response.code,
+                  :elapsed_time => Time.now - start_time,
+                }
               end
               sleep @wait
             end
@@ -209,6 +162,93 @@ module Droonga
           @thread.exit
         end
       end
+
+      def Result
+        def initialize(params)
+          @duration = params[:duration]
+
+          @results = []
+          @total_elapsed_time = 0.0
+          @elapsed_times = []
+          @response_statuses = {}
+        end
+
+        def <<(result)
+          clear_cached_statistics
+
+          @results << result
+
+          @response_statuses[result[:status]] ||= 0
+          @response_statuses[result[:status]] += 1
+
+          @elapsed_times << result[:elapsed_time]
+          @total_elapsed_time += result[:elapsed_time]
+        end
+
+        def total_n_requests
+          @total_n_requests ||=****@resul*****
+        end
+
+        def queries_per_second
+          @queries_per_second ||= total_n_requests.to_f / @duration
+        end
+
+        def sorted_response_statuses
+          @sorted_response_statuses ||= prepare_sorted_response_statuses
+        end
+
+        def min_elapsed_time
+          @min_elapsed_time ||= @elapsed_times.min
+        end
+
+        def max_elapsed_time
+          @max_elapsed_time ||= @elapsed_times.min
+        end
+
+        def average_elapsed_time
+          @average_elapsed_time ||= @total_elapsed_time / @elapsed_times.size
+        end
+
+        def to_s
+          "Total requests: #{total_n_requests} " +
+            "(#{queries_per_second} queries per second)\n" +
+          "Status:\n" +
+          sorted_response_statuses.collect do |status, percentage|
+            "  #{status}: #{percentage} %\n"
+          end +
+          "Elapsed time:\n" +
+          "  min:     #{min_elapsed_time} sec\n" +
+          "  max:     #{max_elapsed_time} sec\n" +
+          "  average: #{average_elapsed_time} sec" +
+        end
+
+        private
+        def clear_cached_statistics
+          @total_n_requests = nil
+          @queries_per_second = nil
+          @sorted_response_statuses = nil
+          @min_elapsed_time = nil
+          @max_elapsed_time = nil
+          @average_elapsed_time = nil
+        end
+
+        def prepare_sorted_response_statuses
+          http_status_percentages = []
+          @response_statuses.each do |status, n_results|
+            percentage = n_results.to_f / total_n_requests * 100
+            http_status_percentages << {:percentage => percentage,
+                                        :status => status}
+          end
+          http_status_percentages.sort! do |a, b|
+            (-1) * (a[:percentage] <=> b[:percentage])
+          end
+          sorted_response_statuses = {}
+          http_status_percentages.each do |status|
+            sorted_response_statuses[status[:status]] = status[:percentage]
+          end
+          sorted_response_statuses
+        end
+      end
     end
   end
 end
-------------- next part --------------
HTML����������������������������...
Download 



More information about the Groonga-commit mailing list
Back to archive index