perf_check 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/perf_check +3 -1
- data/lib/perf_check.rb +40 -25
- data/lib/perf_check/config.rb +14 -2
- data/lib/perf_check/git.rb +20 -19
- data/lib/perf_check/output.rb +86 -25
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9762190d0d025f9e0b5667bb8c3617de492a60fe
|
4
|
+
data.tar.gz: 3852d966b1245fd2c7fde01b70fef9bc7c043d86
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 43cfa5145f18d1bc38f3cc528c7f8e51e7663c93e4f4e2c62b5dc31ade5104a8c1cf25aa73e7d848234dd129afb709e7b08c9bc71084ab8c693433417d88818e
|
7
|
+
data.tar.gz: ee033dd7afe11300842e5ac28b09672881a56b38c482db2e90f0395e2dc7e9ce447a68117a40d32140c7a21874c98dbc4eedf0dd0c9ace7488a409ea3e7a4329
|
data/bin/perf_check
CHANGED
data/lib/perf_check.rb
CHANGED
@@ -28,7 +28,8 @@ class PerfCheck
|
|
28
28
|
'--ignore-matching-lines=/mini-profiler-resources/includes.js'],
|
29
29
|
brief: false,
|
30
30
|
caching: true,
|
31
|
-
json: false
|
31
|
+
json: false,
|
32
|
+
hard_reset: false
|
32
33
|
)
|
33
34
|
|
34
35
|
@logger = Logger.new(STDERR).tap do |logger|
|
@@ -68,20 +69,24 @@ class PerfCheck
|
|
68
69
|
|
69
70
|
def run
|
70
71
|
begin
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
git.checkout_reference(options.reference)
|
76
|
-
test_cases.each{ |x| x.switch_to_reference_context }
|
77
|
-
|
72
|
+
if options.compare_paths?
|
73
|
+
raise "Must have two paths" if test_cases.count != 2
|
74
|
+
profile_compare_paths_requests
|
75
|
+
else
|
78
76
|
profile_requests
|
77
|
+
if options.reference
|
78
|
+
git.stash_if_needed
|
79
|
+
git.checkout(options.reference, bundle_after_checkout: true, hard_reset: options.hard_reset)
|
80
|
+
test_cases.each{ |x| x.switch_to_reference_context }
|
81
|
+
|
82
|
+
profile_requests
|
83
|
+
end
|
79
84
|
end
|
80
85
|
ensure
|
81
|
-
server.exit
|
86
|
+
server.exit
|
82
87
|
if options.reference
|
83
|
-
git.
|
84
|
-
|
88
|
+
git.checkout(git.current_branch, bundle_after_checkout: true, hard_reset: options.hard_reset)
|
89
|
+
git.pop if git.stashed?
|
85
90
|
end
|
86
91
|
|
87
92
|
callbacks = {}
|
@@ -97,29 +102,39 @@ class PerfCheck
|
|
97
102
|
|
98
103
|
private
|
99
104
|
|
100
|
-
def
|
101
|
-
|
105
|
+
def profile_compare_paths_requests
|
106
|
+
first = test_cases[0]
|
107
|
+
reference_test = test_cases[1]
|
108
|
+
profile_test_case(first)
|
109
|
+
reference_test.switch_to_reference_context
|
110
|
+
profile_test_case(reference_test)
|
111
|
+
end
|
102
112
|
|
113
|
+
def profile_test_case(test)
|
114
|
+
trigger_before_start_callbacks(test)
|
115
|
+
run_migrations_up if options.run_migrations?
|
103
116
|
server.restart
|
104
|
-
test_cases.each_with_index do |test, i|
|
105
|
-
trigger_before_start_callbacks(test)
|
106
|
-
server.restart unless i.zero? || options.diff
|
107
117
|
|
108
|
-
|
118
|
+
test.cookie = options.cookie
|
109
119
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
end
|
116
|
-
|
117
|
-
test.run(server, options)
|
120
|
+
if options.diff
|
121
|
+
logger.info("Issuing #{test.resource}")
|
122
|
+
else
|
123
|
+
logger.info ''
|
124
|
+
logger.info("Benchmarking #{test.resource}:")
|
118
125
|
end
|
126
|
+
|
127
|
+
test.run(server, options)
|
119
128
|
ensure
|
120
129
|
run_migrations_down if options.run_migrations?
|
121
130
|
end
|
122
131
|
|
132
|
+
def profile_requests
|
133
|
+
test_cases.each do |test|
|
134
|
+
profile_test_case(test)
|
135
|
+
end
|
136
|
+
end
|
137
|
+
|
123
138
|
def run_migrations_up
|
124
139
|
logger.info "Running db:migrate"
|
125
140
|
logger.info `cd #{app_root} && bundle exec rake db:migrate`
|
data/lib/perf_check/config.rb
CHANGED
@@ -25,11 +25,11 @@ class PerfCheck
|
|
25
25
|
end
|
26
26
|
|
27
27
|
opts.on('--quick', '-q',
|
28
|
-
'
|
28
|
+
'20 requests just on this branch (no comparison with master)') do
|
29
29
|
options.reference = nil
|
30
30
|
end
|
31
31
|
|
32
|
-
opts.on('--no-caching', 'Do not enable fragment caching') do
|
32
|
+
opts.on('--no-caching', 'Do not enable fragment caching (Rails.cache will still work)') do
|
33
33
|
options.caching = false
|
34
34
|
end
|
35
35
|
|
@@ -37,6 +37,10 @@ class PerfCheck
|
|
37
37
|
options[:run_migrations?] = true
|
38
38
|
end
|
39
39
|
|
40
|
+
opts.on('--compare-paths', 'Compare two paths against each other on the same branch') do
|
41
|
+
options[:compare_paths?] = true
|
42
|
+
end
|
43
|
+
|
40
44
|
opts.on('--302-success', 'Consider HTTP 302 code a successful request') do
|
41
45
|
options.http_statuses.push(302)
|
42
46
|
end
|
@@ -46,6 +50,14 @@ class PerfCheck
|
|
46
50
|
end
|
47
51
|
|
48
52
|
opts.separator "\nMisc"
|
53
|
+
opts.on('-h', 'Display this help') do
|
54
|
+
# Do nothing, just don't error
|
55
|
+
end
|
56
|
+
|
57
|
+
opts.on('--deployment','Use git fetch/reset instead of the safe/friendly checkout') do
|
58
|
+
options.hard_reset = true
|
59
|
+
end
|
60
|
+
|
49
61
|
opts.on('--cookie COOKIE', '-c') do |cookie|
|
50
62
|
options.cookie = cookie
|
51
63
|
end
|
data/lib/perf_check/git.rb
CHANGED
@@ -18,32 +18,21 @@ class PerfCheck
|
|
18
18
|
@current_branch = exec "git rev-parse --abbrev-ref HEAD"
|
19
19
|
end
|
20
20
|
|
21
|
-
def
|
22
|
-
checkout(reference)
|
23
|
-
end
|
24
|
-
|
25
|
-
def checkout_current_branch(bundle=true)
|
26
|
-
checkout(@current_branch, bundle)
|
27
|
-
end
|
28
|
-
|
29
|
-
def checkout(branch, bundle=true)
|
21
|
+
def checkout(branch, bundle_after_checkout: true, hard_reset: false)
|
30
22
|
logger.info("Checking out #{branch} and bundling... ")
|
31
|
-
|
23
|
+
if hard_reset
|
24
|
+
exec "git fetch --quiet && git reset --hard origin/#{branch} --quiet"
|
25
|
+
else
|
26
|
+
exec "git checkout #{branch} --quiet"
|
27
|
+
end
|
32
28
|
|
33
29
|
unless $?.success?
|
34
30
|
logger.fatal("Problem with git checkout! Bailing...")
|
35
31
|
raise NoSuchBranch
|
36
32
|
end
|
37
33
|
|
38
|
-
|
39
|
-
|
40
|
-
if bundle
|
41
|
-
Bundler.with_clean_env{ exec "bundle" }
|
42
|
-
unless $?.success?
|
43
|
-
logger.fatal("Problem bundling! Bailing...")
|
44
|
-
raise BundleError
|
45
|
-
end
|
46
|
-
end
|
34
|
+
update_submodules
|
35
|
+
bundle if bundle_after_checkout
|
47
36
|
end
|
48
37
|
|
49
38
|
def stash_if_needed
|
@@ -92,6 +81,18 @@ class PerfCheck
|
|
92
81
|
|
93
82
|
private
|
94
83
|
|
84
|
+
def update_submodules
|
85
|
+
exec "git submodule update --quiet"
|
86
|
+
end
|
87
|
+
|
88
|
+
def bundle
|
89
|
+
Bundler.with_clean_env{ exec "bundle" }
|
90
|
+
unless $?.success?
|
91
|
+
logger.fatal("Problem bundling! Bailing...")
|
92
|
+
raise BundleError
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
95
96
|
def current_migrations_not_on_master
|
96
97
|
exec("git diff master --name-only --diff-filter=A db/migrate/").
|
97
98
|
split.reverse
|
data/lib/perf_check/output.rb
CHANGED
@@ -25,6 +25,37 @@ class PerfCheck
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
+
def print_results_of_compared_paths
|
29
|
+
puts("==== Results ====")
|
30
|
+
|
31
|
+
first_test = test_cases[0]
|
32
|
+
second_test = test_cases[1]
|
33
|
+
|
34
|
+
test_latency = first_test.this_latency
|
35
|
+
reference_latency = second_test.reference_latency
|
36
|
+
|
37
|
+
test_latency_output = latency_output(test_latency)
|
38
|
+
reference_latency_output = latency_output(reference_latency)
|
39
|
+
|
40
|
+
puts("reference path:" + first_test.resource.bold)
|
41
|
+
puts("test path:" + second_test.resource.bold)
|
42
|
+
|
43
|
+
latency_difference = test_latency - reference_latency
|
44
|
+
|
45
|
+
change_factor = change_factor(latency_difference, reference_latency, test_latency)
|
46
|
+
change_factor_output = sprintf('%.1fx', change_factor)
|
47
|
+
percent_change = calculate_percent_change(latency_difference, reference_latency)
|
48
|
+
|
49
|
+
formatted_change, color = formatted_change_and_color(
|
50
|
+
change_factor_output,
|
51
|
+
percent_change,
|
52
|
+
latency_difference
|
53
|
+
)
|
54
|
+
|
55
|
+
formatted_change = latency_output(latency_difference) + " (#{formatted_change})"
|
56
|
+
print_results(reference_latency_output, test_latency, formatted_change, color)
|
57
|
+
end
|
58
|
+
|
28
59
|
def print_full_results
|
29
60
|
puts("==== Results ====")
|
30
61
|
test_cases.each do |test|
|
@@ -35,35 +66,65 @@ class PerfCheck
|
|
35
66
|
next
|
36
67
|
end
|
37
68
|
|
38
|
-
|
39
|
-
|
40
|
-
difference = sprintf('%+.1fms', test.latency_difference)
|
69
|
+
reference_latency_output = latency_output(test.reference_latency)
|
70
|
+
test_latency_output = latency_output(test.this_latency)
|
41
71
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
formatted_change = "yours is #{formatted_change} faster!"
|
55
|
-
color = :green
|
56
|
-
else
|
57
|
-
formatted_change = "yours is #{formatted_change} slower!!!"
|
58
|
-
color = :light_red
|
59
|
-
end
|
60
|
-
formatted_change = difference + " (#{formatted_change})"
|
72
|
+
latency_difference = test.latency_difference
|
73
|
+
reference_latency = test.reference_latency
|
74
|
+
test_latency = test.this_latency
|
75
|
+
|
76
|
+
change_factor = change_factor(
|
77
|
+
latency_difference,
|
78
|
+
reference_latency,
|
79
|
+
test_latency
|
80
|
+
)
|
81
|
+
|
82
|
+
change_factor_output = sprintf('%.1fx', change_factor)
|
83
|
+
percent_change = calculate_percent_change(latency_difference, reference_latency)
|
61
84
|
|
62
|
-
|
63
|
-
|
64
|
-
puts(("change: ".rjust(15) + "#{formatted_change}").bold.send(color))
|
85
|
+
formatted_change, color = formatted_change_and_color(change_factor_output, percent_change, latency_difference)
|
86
|
+
formatted_change = latency_output(latency_difference) + " (#{formatted_change})"
|
65
87
|
|
88
|
+
print_results(reference_latency_output, test_latency_output, formatted_change, color)
|
66
89
|
print_diff_results(test.response_diff) if options.verify_no_diff
|
67
90
|
end
|
68
91
|
end
|
92
|
+
|
93
|
+
private
|
94
|
+
|
95
|
+
def latency_output(latency)
|
96
|
+
sprintf('%.1fms', latency)
|
97
|
+
end
|
98
|
+
|
99
|
+
def change_factor(latency_difference, reference_latency, test_latency)
|
100
|
+
if latency_difference < 0
|
101
|
+
reference_latency / test_latency
|
102
|
+
else
|
103
|
+
test_latency / reference_latency
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
def print_results(reference_latency, test_latency, formatted_change, color)
|
108
|
+
puts("reference: ".rjust(15) + "#{reference_latency}")
|
109
|
+
puts("your branch: ".rjust(15)+ "#{test_latency}")
|
110
|
+
puts(("change: ".rjust(15) + "#{formatted_change}").bold.send(color))
|
111
|
+
end
|
112
|
+
|
113
|
+
def formatted_change_and_color(change_factor_output, percent_change, latency_difference)
|
114
|
+
if percent_change < 10
|
115
|
+
formatted_change = "yours is about the same"
|
116
|
+
color = :blue
|
117
|
+
elsif latency_difference < 0
|
118
|
+
formatted_change = "yours is #{change_factor_output} faster!"
|
119
|
+
color = :green
|
120
|
+
else
|
121
|
+
formatted_change = "yours is #{change_factor_output} slower!!!"
|
122
|
+
color = :light_red
|
123
|
+
end
|
124
|
+
[formatted_change, color]
|
125
|
+
end
|
126
|
+
|
127
|
+
def calculate_percent_change(latency_difference, reference_latency)
|
128
|
+
100*(latency_difference / reference_latency).abs
|
129
|
+
end
|
69
130
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: perf_check
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- rubytune
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-09
|
11
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|