perf_check 0.1.18 → 0.2.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a5210e19711849c1d31c9a59f11f3a7f492e9c48
4
- data.tar.gz: e57b035135efc2569d20d3a18cb776c979894274
3
+ metadata.gz: b748791510099f0d04eccd3624623f0f268484a1
4
+ data.tar.gz: ebd96c65c3d27d78bd64cf01727e1e5a476e1d89
5
5
  SHA512:
6
- metadata.gz: 588ac42f1b7b9b649f798395c8876430862f7fb6f56e56423172b65c8cc53f4a4390ceed18c1a73c2129649d54f3fcebc540dffce51f36f082ddc2ee9ffdc3a9
7
- data.tar.gz: 85e004752e36cb9176ad4543dfee9d6ba9043d478ab58505f992b6267667ff2b0474040a3dae53717d8ddba3677b2b2ff5ea73a41b877f54bdc56135d5d0d8df
6
+ metadata.gz: ee57d225bcd04131ddbc874688eb383db6ca7296c44372e4e49bb0ab1b22f77088715e7cef012321594516620ff5a40aff528c19891ff5af69af3d249dd1de16
7
+ data.tar.gz: 0e4426dc65b80ef2ac67f931f1c84eed0dbbe6e3957a3844072ab02b9d7f2733be7a168601dd7d12156bb2e23417fa105fce613d7b02a3996d0ac13231e057f4
data/bin/perf_check CHANGED
@@ -2,157 +2,38 @@
2
2
 
3
3
  require 'perf_check'
4
4
 
5
- perf_check = PerfCheck.new
6
- options = perf_check.options
7
- options.login = nil
8
- options.number_of_requests = 10
9
- options.reference = 'master'
10
- options.http_statuses = [200]
11
- options.verify_responses = false
12
- options.caching = true
13
-
14
5
  ORIGINAL_ARGV = ARGV.clone
15
6
 
16
- opts = OptionParser.new do |opts|
17
- opts.banner = "Usage: perf_check [options] [route ...]"
18
-
19
- opts.separator 'Login options:'
20
- opts.on('--admin', 'Log in as admin user for route') do
21
- options.login = :admin
22
- end
23
-
24
- opts.on('--standard', 'Log in as standard user for route') do
25
- options.login = :standard
26
- end
27
-
28
- opts.on('--super', 'Log in as super user') do
29
- options.login = :super
30
- end
31
-
32
- opts.on('--user USER', '-u', 'Log in as USER') do |user|
33
- options.login = user
34
- end
35
-
36
- opts.on('--no-login', '-L', "Don't log in") do
37
- options.login = nil
38
- end
39
-
40
- opts.separator "\nBenchmark options:"
41
- opts.on('--requests N', '-n',
42
- 'Use N requests in benchmark, defaults to 10') do |n|
43
- options.number_of_requests = n.to_i
44
- end
45
-
46
- opts.on('--reference COMMIT', '-r',
47
- 'Benchmark against COMMIT instead of master') do |commit|
48
- options.reference = commit
49
- end
50
-
51
- opts.on('--quick', '-q',
52
- 'Fire off 5 requests just on this branch, no comparison with master') do
53
- options.number_of_requests = 5
54
- options.reference = nil
55
- end
56
-
57
- opts.on('--no-caching', 'Do not enable fragment caching') do
58
- options.caching = false
59
- end
60
-
61
- opts.on('--fail-fast', '-f', 'Bail immediately on non-200 HTTP response') do
62
- options[:fail_fast?] = true
63
- end
64
-
65
- opts.on('--302-success', 'Consider HTTP 302 code a successful request') do
66
- options.http_statuses.push(302)
67
- end
68
-
69
- opts.on('--302-failure', 'Consider HTTP 302 code an unsuccessful request') do
70
- options.http_statuses.delete(302)
71
- end
72
-
73
- opts.separator "\nMisc"
74
- opts.on('--input FILE', '-i') do |input|
75
- File.readlines(input).each do |resource|
76
- ARGV << resource.strip
77
- end
78
- end
79
-
80
- opts.on('--verify-responses',
81
- 'Check whether there is a diff between the responses of this and the reference branch') do
82
- options.verify_responses = true
83
- end
7
+ perf_check = PerfCheck.new
84
8
 
85
- opts.on('--brief', '-b') do
86
- options.brief = true
87
- end
9
+ at_exit do
10
+ cbdata = {}
88
11
 
89
- opts.on('--diff') do
90
- options.diff = true
91
- options.brief = true
92
- options.verify_responses = true
93
- options.number_of_requests = 1
12
+ if $!
13
+ cbdata[:error_message] = "#{$!.class}: #{$!.message}\n"
14
+ cbdata[:error_message] << $!.backtrace.map{|x| "\t#{x}"}.join("\n")
94
15
  end
95
16
 
96
- opts.separator ''
97
- opts.separator <<EOF
98
- Usage examples:
99
- Benchmark PostController#index against master
100
- perf_check /user/45/posts
101
- perf_check /user/45/posts -n5
102
- perf_check /user/45/posts --standard
103
- perf_check /user/45/posts --admin
104
-
105
- Benchmark against a specific commit
106
- perf_check /user/45/posts -r 0123abcdefg
107
- perf_check /user/45/posts -r HEAD~2
108
-
109
- Benchmark the changes in the working tree
110
- perf_check /user/45/posts -r HEAD
111
-
112
- Benchmark and diff the output against master
113
- perf_check /user/45/posts --verify-responses
114
-
115
- Just diff the output on your branch with master
116
- perf_check /user/45/posts --diff
117
-
118
- Diff a bunch of urls listed in a file (newline seperated)
119
- perf_check --diff --input FILE
120
- EOF
17
+ perf_check.trigger_when_finished_callbacks(cbdata)
121
18
  end
122
19
 
123
- error = nil
124
- begin
125
- opts.parse!
20
+ PerfCheck.load_config
21
+ PerfCheck::Options.parse!
126
22
 
127
- PerfCheck.require_rails(options)
23
+ ARGV.each{ |route| perf_check.add_test_case(route) }
128
24
 
129
- ARGV.each do |route|
130
- perf_check.add_test_case(route)
131
- end
132
-
133
- if perf_check.test_cases.empty?
134
- abort(opts.help)
135
- end
136
-
137
- perf_check.trigger_before_start_callback
25
+ if perf_check.test_cases.empty?
26
+ abort(PerfCheck::Options.help)
27
+ end
138
28
 
139
- perf_check.sanity_check
140
- perf_check.run
29
+ perf_check.run
141
30
 
142
- if options.brief
143
- perf_check.print_brief_results
144
- else
145
- perf_check.print_results
146
- end
147
- rescue Exception => error
148
- ensure
149
- cbdata = {}
150
- if error
151
- cbdata[:error_message] = "#{error.class}: #{error.message}\n"
152
- cbdata[:error_message] << error.backtrace.map{|x| "\t#{x}"}.join("\n")
153
- end
154
- perf_check.trigger_when_finished_callback(cbdata)
155
- raise error if error
31
+ if PerfCheck.config.brief
32
+ perf_check.print_brief_results
33
+ elsif PerfCheck.config.json
34
+ perf_check.print_json_results
35
+ else
36
+ perf_check.print_full_results
156
37
  end
157
38
 
158
39
  # _______________________
@@ -11,28 +11,42 @@ class PerfCheck
11
11
  def self.checkout_reference(reference='master')
12
12
  checkout(reference)
13
13
  at_exit do
14
- $stderr.puts
15
- Git.checkout_current_branch
14
+ logger.info ''
15
+ Git.checkout_current_branch(false)
16
16
  end
17
17
  end
18
18
 
19
- def self.checkout_current_branch
20
- checkout(@current_branch)
19
+ def self.checkout_current_branch(bundle=true)
20
+ checkout(@current_branch, bundle)
21
21
  end
22
22
 
23
- def self.checkout(branch)
24
- $stderr.print "Checking out #{branch} and bundling... "
23
+ def self.checkout(branch, bundle=true)
24
+ logger.info("Checking out #{branch} and bundling... ")
25
25
  `git checkout #{branch} --quiet`
26
- abort "Problem with git checkout! Bailing..." unless $?.success?
27
- `bundle`
28
- abort "Problem bundling! Bailing..." unless $?.success?
26
+
27
+ unless $?.success?
28
+ logger.fatal("Problem with git checkout! Bailing...") && abort
29
+ end
30
+
31
+ `git submodule update --quiet`
32
+
33
+ if bundle
34
+ Bundler.with_clean_env{ `bundle` }
35
+ unless $?.success?
36
+ logger.fatal("Problem bundling! Bailing...") && abort
37
+ end
38
+ end
29
39
  end
30
40
 
31
41
  def self.stash_if_needed
32
42
  if anything_to_stash?
33
- $stderr.print("Stashing your changes... ")
43
+ logger.info("Stashing your changes... ")
34
44
  system('git stash -q >/dev/null')
35
- abort("Problem with git stash! Bailing...") unless $?.success?
45
+
46
+ unless $?.success?
47
+ logger.fatal("Problem with git stash! Bailing...") && abort
48
+ end
49
+
36
50
  at_exit do
37
51
  Git.pop
38
52
  end
@@ -46,13 +60,12 @@ class PerfCheck
46
60
  end
47
61
 
48
62
  def self.pop
49
- warn("Git stash applying...")
63
+ logger.info("Git stash applying...")
50
64
  system('git stash pop -q')
51
- abort("Problem with git stash! Bailing...") unless $?.success?
52
- end
53
- end
54
65
 
55
- def self.normalize_resource(resource)
56
- resource.sub(/^([^\/])/, '/\1')
66
+ unless $?.success?
67
+ logger.fatal("Problem with git stash! Bailing...") && abort
68
+ end
69
+ end
57
70
  end
58
71
  end
@@ -1,9 +1,8 @@
1
1
  class PerfCheck
2
2
  class Railtie < Rails::Railtie
3
+ config.before_initialize do |app|
3
4
 
4
- config.before_initialize do
5
-
6
- if defined?(Rack::MiniProfiler) && ENV['PERF_CHECK']
5
+ if defined?(Rack::MiniProfiler)
7
6
  # Integrate with rack-mini-profiler
8
7
  tmp = "#{Rails.root}/tmp/perf_check/miniprofiler"
9
8
  FileUtils.mkdir_p(tmp)
@@ -12,19 +11,20 @@ class PerfCheck
12
11
  Rack::MiniProfiler::FileStore.new(:path => tmp)
13
12
  end
14
13
 
15
- if ENV['PERF_CHECK']
16
- # Force cacheing .... :\
17
- config = Rails::Application::Configuration
18
- config.send(:define_method, :cache_classes){ true }
14
+ # Force caching .... :\
15
+ config = Rails::Application::Configuration
16
+ config.send(:define_method, :cache_classes){ true }
19
17
 
20
- fragment_caching = !ENV['PERF_CHECK_NOCACHING']
21
- config = ActiveSupport::Configurable::Configuration
22
- config.send(:define_method, :perform_caching){ fragment_caching }
23
- end
18
+ fragment_caching = !ENV['PERF_CHECK_NOCACHING']
19
+ config = ActiveSupport::Configurable::Configuration
20
+ config.send(:define_method, :perform_caching){ fragment_caching }
24
21
 
25
- if ENV['PERF_CHECK'] && ENV['PERF_CHECK_VERIFICATION']
22
+ if ENV['PERF_CHECK_VERIFICATION']
26
23
  PerfCheck::Server.seed_random!
27
24
  end
25
+
26
+ require 'perf_check/middleware'
27
+ app.middleware.use PerfCheck::Middleware
28
28
  end
29
29
  end
30
30
  end
@@ -6,54 +6,6 @@ require 'fileutils'
6
6
 
7
7
  class PerfCheck
8
8
  class Server
9
- def self.authorization(&block)
10
- define_method(:login, &block)
11
- end
12
-
13
- def self.authorization_action(method, login_route, &block)
14
- Rails.application.reload_routes!
15
- p = PerfCheck::Server.recognize_path(login_route, :method => method)
16
- controller = "#{p[:controller]}_controller".classify.constantize
17
- action = p[:action]
18
-
19
- controller.send(:define_method, :get_perf_check_session, &block)
20
- controller.send(:define_method, action) do
21
- login = params[:login_symbol].presence.try(:to_sym) || params[:login]
22
- get_perf_check_session(login, params[:route])
23
- render :nothing => true
24
- end
25
- controller.send(:skip_before_filter, :verify_authenticity_token)
26
-
27
- authorization do |login, route|
28
- http = Net::HTTP.new(host, port)
29
- params = login.is_a?(Symbol) ? "login_symbol=#{login}" : "login=#{login}"
30
- if method == :post
31
- response = http.post(login_route, params)
32
- elsif method == :get
33
- response = http.get(login_route+"?#{params}")
34
- end
35
-
36
- response['Set-Cookie']
37
- end
38
- end
39
-
40
- def self.mounted_path(engine)
41
- route = Rails.application.routes.routes.detect do |route|
42
- route.app == engine
43
- end
44
- route && route.path
45
- end
46
-
47
- def self.recognize_path(path, opts={})
48
- Rails::Engine.subclasses.each do |engine|
49
- if match = mounted_path(engine) =~ path
50
- path = path.sub(match.to_s, '')
51
- return engine.routes.recognize_path(path, opts)
52
- end
53
- end
54
- Rails.application.routes.recognize_path(path, opts)
55
- end
56
-
57
9
  def self.seed_random!
58
10
  # Seed random
59
11
  srand(1)
@@ -80,27 +32,12 @@ class PerfCheck
80
32
  end
81
33
  end
82
34
 
83
- def self.sign_cookie_data(key, data, opts={})
84
- opts[:serializer] ||= Marshal
85
- secret = Rails.application.config.secret_token
86
-
87
- marshal = ActiveSupport::MessageVerifier.new(secret,
88
- :serializer => opts[:serializer])
89
- marshal_value = marshal.generate(data)
90
-
91
- "#{key}=#{marshal_value}"
92
- end
93
-
94
35
  def initialize
95
36
  at_exit do
96
- exit
37
+ exit rescue nil
97
38
  end
98
39
  end
99
40
 
100
- def login(login, route)
101
- ''
102
- end
103
-
104
41
  def pid
105
42
  pidfile = 'tmp/pids/server.pid'
106
43
  File.read(pidfile).to_i if File.exists?(pidfile)
@@ -130,14 +67,16 @@ class PerfCheck
130
67
  response = nil
131
68
  prepare_to_profile
132
69
 
133
- latency = 1000 * Benchmark.measure do
134
- http.start
135
- response = yield(http)
136
- http.finish
137
- end.real
70
+ http.start
71
+ response = yield(http)
72
+ http.finish
73
+
74
+ latency = 1000 * response['X-Runtime'].to_f
75
+ query_count = response['X-PerfCheck-Query-Count'].to_i
138
76
 
139
77
  Profile.new.tap do |result|
140
78
  result.latency = latency
79
+ result.query_count = query_count
141
80
  result.profile_url = latest_profiler_url
142
81
  result.response_body = response.body
143
82
  result.response_code = response.code.to_i
@@ -153,6 +92,14 @@ class PerfCheck
153
92
  end
154
93
 
155
94
  def start
95
+ ENV['PERF_CHECK'] = '1'
96
+ if PerfCheck.config.verify_responses
97
+ ENV['PERF_CHECK_VERIFICATION'] = '1'
98
+ end
99
+ unless PerfCheck.config.caching
100
+ ENV['PERF_CHECK_NOCACHING'] = '1'
101
+ end
102
+
156
103
  system('rails server -b 127.0.0.1 -d -p 3031 >/dev/null')
157
104
  sleep(1.5)
158
105
 
@@ -161,10 +108,10 @@ class PerfCheck
161
108
 
162
109
  def restart
163
110
  if !@running
164
- $stderr.print "starting rails...\n"
111
+ logger.info("starting rails...")
165
112
  start
166
113
  else
167
- $stderr.print "re-starting rails...\n"
114
+ logger.info("re-starting rails...")
168
115
  exit
169
116
  start
170
117
  end
@@ -4,19 +4,13 @@ require 'diffy'
4
4
 
5
5
  class PerfCheck
6
6
  class TestCase
7
- attr_accessor :resource, :controller, :action, :format
7
+ attr_accessor :resource
8
8
  attr_accessor :cookie, :this_response, :reference_response
9
9
  attr_accessor :this_profiles, :reference_profiles
10
10
 
11
11
  def initialize(route)
12
- params = PerfCheck::Server.recognize_path(route)
13
-
14
12
  self.this_profiles = []
15
13
  self.reference_profiles = []
16
-
17
- self.controller = params[:controller]
18
- self.action = params[:action]
19
- self.format = params[:format]
20
14
  self.resource = route
21
15
  end
22
16
 
@@ -26,19 +20,14 @@ class PerfCheck
26
20
 
27
21
  def run(server, options)
28
22
  unless options.diff
29
- print("\t"+'request #'.underline)
30
- print(" "+'latency'.underline)
31
- print(" "+'server rss'.underline)
32
- print(" "+'status'.underline)
33
- puts(" "+'profiler data'.underline)
23
+ logger.info("\t"+['request', 'latency', 'server rss', 'status', 'queries', 'profiler data'].map(&:underline).join(" "))
34
24
  end
35
25
 
36
26
  profiles = (@context == :reference) ? reference_profiles : this_profiles
37
27
 
38
- headers = {'Cookie' => "#{cookie}"}
39
- unless self.format
40
- headers['Accept'] = 'text/html,application/xhtml+xml,application/xml'
41
- end
28
+ headers = {'Cookie' => "#{cookie}".strip}
29
+ headers['Accept'] = 'text/html,application/xhtml+xml,application/xml'
30
+
42
31
  (options.number_of_requests+1).times do |i|
43
32
  profile = server.profile do |http|
44
33
  http.get(resource, headers)
@@ -50,10 +39,10 @@ class PerfCheck
50
39
  error_dump.write(profile.response_body)
51
40
  end
52
41
  error = sprintf("\t%2i:\tFAILED! (HTTP %d)", i, profile.response_code)
53
- puts(error.red.bold)
54
- puts("\t The server responded with a non-2xx status for this request.")
55
- puts("\t The response has been written to tmp/perf_check/failed_request.html")
56
- exit(1)
42
+ logger.fatal(error.red.bold)
43
+ logger.fatal("\t The server responded with a non-2xx status for this request.")
44
+ logger.fatal("\t The response has been written to tmp/perf_check/failed_request.html")
45
+ abort
57
46
  end
58
47
  end
59
48
 
@@ -69,15 +58,19 @@ class PerfCheck
69
58
  end
70
59
  end
71
60
 
61
+ profile.server_memory = server.mem
62
+
72
63
  unless options.diff
73
- printf("\t%2i:\t %.1fms %4dMB\t %s\t %s\n",
74
- i, profile.latency, server.mem,
75
- profile.response_code, profile.profile_url)
64
+ row = sprintf("\t%2i:\t %.1fms %4dMB\t %s\t %s",
65
+ i, profile.latency, profile.server_memory,
66
+ profile.response_code, profile.query_count, profile.profile_url)
67
+ logger.info(row)
76
68
  end
77
69
 
78
70
  profiles << profile
79
71
  end
80
- puts unless options.diff # pretty!
72
+
73
+ logger.info '' unless options.diff # pretty!
81
74
  end
82
75
 
83
76
  def this_latency
@@ -89,6 +82,15 @@ class PerfCheck
89
82
  reference_profiles.map(&:latency).inject(0.0, :+) / reference_profiles.size
90
83
  end
91
84
 
85
+ def this_query_count
86
+ this_profiles.map(&:query_count).inject(0, :+) / this_profiles.size
87
+ end
88
+
89
+ def reference_query_count
90
+ return nil if reference_profiles.empty?
91
+ reference_profiles.map(&:query_count).inject(0, :+) / reference_profiles.size
92
+ end
93
+
92
94
  def latency_difference
93
95
  this_latency - reference_latency
94
96
  end
data/lib/perf_check.rb CHANGED
@@ -1,56 +1,27 @@
1
- # coding: utf-8
2
-
3
- require 'optparse'
4
1
  require 'net/http'
5
2
  require 'digest'
6
3
  require 'fileutils'
7
4
  require 'benchmark'
8
5
  require 'ostruct'
9
6
  require 'colorize'
7
+ require 'json'
10
8
 
11
9
  class PerfCheck
12
10
  attr_accessor :options, :server, :test_cases
13
11
 
14
- def self.diff_options
15
- @@diff_options ||=
16
- ['-U3', '--ignore-matching-lines=/mini-profiler-resources/includes.js']
17
- end
18
-
19
- def self.require_rails(options)
20
- ENV['PERF_CHECK'] = '1'
21
- if options.verify_responses
22
- ENV['PERF_CHECK_VERIFICATION'] = '1'
23
- end
24
- if !options.caching
25
- ENV['PERF_CHECK_NOCACHING'] = '1'
26
- end
12
+ def self.app_root
13
+ @app_root ||= begin
14
+ dir = Dir.pwd
15
+ until dir == '/' || File.exist?("#{dir}/config/application.rb")
16
+ dir = File.dirname(dir)
17
+ end
27
18
 
28
- app_root = Dir.pwd
29
- until app_root == '/' || File.exist?("#{app_root}/config/application.rb")
30
- app_root = File.dirname(app_root)
31
- end
19
+ unless File.exist?("#{dir}/config/application.rb")
20
+ abort("perf_check should be run from a rails directory")
21
+ end
32
22
 
33
- unless File.exist?("#{app_root}/config/application.rb")
34
- abort("perf_check should be run from a rails directory")
23
+ dir
35
24
  end
36
-
37
- require "#{app_root}/config/environment"
38
- end
39
-
40
- def self.when_finished(&block)
41
- @when_finished_callback = block
42
- end
43
-
44
- def self.when_finished_callback
45
- @when_finished_callback || proc{ |*args| }
46
- end
47
-
48
- def self.before_start(&block)
49
- @before_start_callback = block
50
- end
51
-
52
- def self.before_start_callback
53
- @before_start_callback || proc{ |*args| }
54
25
  end
55
26
 
56
27
  def initialize
@@ -60,139 +31,52 @@ class PerfCheck
60
31
  end
61
32
 
62
33
  def add_test_case(route)
63
- route = PerfCheck.normalize_resource(route)
64
- test_cases.push(TestCase.new(route))
65
- end
66
-
67
- def sanity_check
68
- if ENV['RAILS_ENV'] == 'production'
69
- abort("perf_check cannot be run in the production environment")
70
- end
71
-
72
- if Git.current_branch == "master"
73
- puts("Yo, profiling master vs. master isn't too useful, but hey, we'll do it")
74
- end
75
-
76
- puts "="*77
77
- print "PERRRRF CHERRRK! Grab a ☕️ and don't touch your working tree "
78
- puts "(we automate git)"
79
- puts "="*77
34
+ test_cases.push(TestCase.new(route.sub(/^([^\/])/, '/\1')))
80
35
  end
81
36
 
82
37
  def run
83
- (options.reference ? 2 : 1).times do |i|
84
- if i == 1
85
- Git.stash_if_needed
86
- Git.checkout_reference(options.reference)
87
- test_cases.each{ |x| x.switch_to_reference_context }
88
- end
89
-
90
- server.restart
91
- test_cases.each_with_index do |test, i|
92
- server.restart unless i.zero? || options.diff
93
-
94
- if options.login
95
- test.cookie = server.login(options.login, test)
96
- end
97
-
98
- if options.diff
99
- puts "Issuing #{test.resource}"
100
- else
101
- puts("\nBenchmarking #{test.resource}:")
102
- end
103
- test.run(server, options)
104
- end
105
- end
106
- end
107
-
108
- def trigger_before_start_callback
109
- PerfCheck.before_start_callback.call(self)
110
- end
111
-
112
- def trigger_when_finished_callback(data={})
113
- data = data.merge(:current_branch => PerfCheck::Git.current_branch)
114
- results = OpenStruct.new(data)
115
- results[:ARGV] = ORIGINAL_ARGV
116
- if test_cases.size == 1
117
- results.current_latency = test_cases.first.this_latency
118
- results.reference_latency = test_cases.first.reference_latency
119
- end
120
- PerfCheck.when_finished_callback.call(results)
121
- end
122
-
123
- def print_diff_results(diff)
124
- if diff.changed?
125
- print(" Diff: #{diff.file}".bold.light_red)
126
- else
127
- print(" Diff: Output is identical!".bold.light_green)
128
- end
129
- end
130
-
131
- def print_brief_results
132
- test_cases.each do |test|
133
- print(test.resource.ljust(40) + ': ')
134
-
135
- codes = (test.this_profiles+test.reference_profiles).map(&:response_code).uniq
136
- print("(HTTP "+codes.join(',')+") ")
38
+ trigger_before_start_callbacks
137
39
 
138
- printf('%.1fms', test.this_latency)
40
+ profile_requests
139
41
 
140
- puts && next if test.reference_profiles.empty?
42
+ if options.reference
43
+ Git.stash_if_needed
44
+ Git.checkout_reference(options.reference)
45
+ test_cases.each{ |x| x.switch_to_reference_context }
141
46
 
142
- print(sprintf(' (%+5.1fms)', test.latency_difference).bold)
143
- print_diff_results(test.response_diff) if options.verify_responses
144
- puts
47
+ profile_requests
145
48
  end
146
49
  end
147
50
 
148
- def print_results
149
- puts("==== Results ====")
150
- test_cases.each do |test|
151
- puts(test.resource.bold)
51
+ private
152
52
 
153
- if test.reference_profiles.empty?
154
- printf("your branch: ".rjust(15)+"%.1fms\n", test.this_latency)
155
- next
156
- end
53
+ def profile_requests
54
+ server.restart
55
+ test_cases.each_with_index do |test, i|
56
+ server.restart unless i.zero? || options.diff
157
57
 
158
- master_latency = sprintf('%.1fms', test.reference_latency)
159
- this_latency = sprintf('%.1fms', test.this_latency)
160
- difference = sprintf('%+.1fms', test.latency_difference)
58
+ test.cookie = options.cookie
161
59
 
162
- if test.latency_difference < 0
163
- change_factor = test.reference_latency / test.this_latency
164
- else
165
- change_factor = test.this_latency / test.reference_latency
166
- end
167
- formatted_change = sprintf('%.1fx', change_factor)
168
-
169
- percent_change = 100*(test.latency_difference / test.reference_latency).abs
170
- if percent_change < 10
171
- formatted_change = "yours is about the same"
172
- color = :blue
173
- elsif test.latency_difference < 0
174
- formatted_change = "yours is #{formatted_change} faster!"
175
- color = :green
60
+ if options.diff
61
+ logger.info("Issuing #{test.resource}")
176
62
  else
177
- formatted_change = "yours is #{formatted_change} slower!!!"
178
- color = :light_red
63
+ logger.info ''
64
+ logger.info("Benchmarking #{test.resource}:")
179
65
  end
180
- formatted_change = difference + " (#{formatted_change})"
181
66
 
182
- puts("master: ".rjust(15) + "#{master_latency}")
183
- puts("your branch: ".rjust(15)+ "#{this_latency}")
184
- puts(("change: ".rjust(15) + "#{formatted_change}").bold.send(color))
185
-
186
- print_diff_results(test.response_diff) if options.verify_responses
67
+ test.run(server, options)
187
68
  end
188
69
  end
189
70
  end
190
71
 
191
-
72
+ require 'perf_check/logger'
192
73
  require 'perf_check/server'
193
74
  require 'perf_check/test_case'
194
75
  require 'perf_check/git'
76
+ require 'perf_check/config'
77
+ require 'perf_check/callbacks'
78
+ require 'perf_check/output'
195
79
 
196
- if defined?(Rails)
80
+ if defined?(Rails) && ENV['PERF_CHECK']
197
81
  require 'perf_check/railtie'
198
82
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: perf_check
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.18
4
+ version: 0.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - rubytune