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