abprof 0.2.2 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +11 -0
- data/exe/abcompare +86 -0
- data/lib/abprof/version.rb +1 -1
- metadata +2 -2
- data/exe/abcompare +0 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 0c46230d0f2b162c58c08527cac952ecef8c9396
|
4
|
+
data.tar.gz: 71aa9aeeac60e757c1074fa34dc527093ea67dae
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fc6ace0578b40b801af81ebd1e3b315005c43d308a855e07bc5289676bf8ebd2dd47ba5162a3a51a26dcec562442ee701c388e9274d3d60e02528ad9954b69d2
|
7
|
+
data.tar.gz: 1c0c034f694218c58714f4fbd050216b423129cc763b44f5c7cfe48d237616ed82b4701617845862be5bbca7c34efbcfd599e18bdb324c33254fd30c70155e44
|
data/README.md
CHANGED
@@ -16,6 +16,17 @@ set of measured runtimes to determine how likely the two programs are
|
|
16
16
|
to be different from each other, and after the P value is low enough,
|
17
17
|
we give our current estimate of which is faster and by how much.
|
18
18
|
|
19
|
+
Want a nice "getting started" introduction? Here are the original blog
|
20
|
+
posts on using ABProf.
|
21
|
+
|
22
|
+
* <a href="https://appfolio-engineering.squarespace.com/appfolio-engineering/2016/7/18/profiling-ruby-like-an-ab-tester">Profiling Ruby Like an A/B Tester</a>
|
23
|
+
* <a href="https://appfolio-engineering.squarespace.com/appfolio-engineering/2016/8/8/abprof-an-accurate-statistical-profiling-harness">ABProf: An Accurate Statistical Profiling Harness</a>
|
24
|
+
|
25
|
+
For more about the subtleties of profiling in general, may I recommend
|
26
|
+
<a href="https://www.youtube.com/watch?v=kJDOpucaUR4">Matthew Gaudet's
|
27
|
+
wonderful talk "Ruby 3x3: How Will Are We Going To Measure 3X?" from
|
28
|
+
RubyKaigi 2016?</a>
|
29
|
+
|
19
30
|
## Installation
|
20
31
|
|
21
32
|
Add this line to your application's Gemfile:
|
data/exe/abcompare
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
require "trollop"
|
4
|
+
require "abprof"
|
5
|
+
require "abprof/benchmark_dsl"
|
6
|
+
|
7
|
+
OPTS = Trollop::options do
|
8
|
+
banner <<BANNER
|
9
|
+
Specify a first and second command line, and (often) a p-value or other
|
10
|
+
parameters.
|
11
|
+
|
12
|
+
Example: #{$0} examples/sleep.rb examples/sleep_longer.rb
|
13
|
+
|
14
|
+
The first and second commands are the first two arguments. You'll need to
|
15
|
+
quote multi-word commands, as is normal in bash.
|
16
|
+
|
17
|
+
Specifying lots of iterations and trials, high burn-in and a low P value
|
18
|
+
is accurate, but slow.
|
19
|
+
|
20
|
+
Specifying low iterations, trials and burn-in and a high P value gives
|
21
|
+
quick, rough results early on.
|
22
|
+
|
23
|
+
Specifying more iterations per trial is good for highly variable iteration
|
24
|
+
timing.
|
25
|
+
|
26
|
+
Specifying a lower max number of trials keeps the test from running *too*
|
27
|
+
long when the two are identical.
|
28
|
+
|
29
|
+
Specifying a high burn-in is necessary when cache behavior changes timing
|
30
|
+
significantly.
|
31
|
+
|
32
|
+
Vast numbers of trials can nearly always occasionally show differences
|
33
|
+
*somewhere* along the line, just by random chance. To avoid this, pick how
|
34
|
+
many samples first, run them all in one go, and then just check the p value
|
35
|
+
once.
|
36
|
+
|
37
|
+
A p value is often interpreted as the probability we got a wrong answer.
|
38
|
+
That's an oversimplification, but not (usually) a terrible one.
|
39
|
+
BANNER
|
40
|
+
opt :debug, "Print more output to console"
|
41
|
+
opt :bare, "Use bare command-line commands, no Ruby harness", :default => ($0["compare"])
|
42
|
+
opt :pvalue, "P value (certainty) for Welch's T test", :default => 0.05
|
43
|
+
opt :burnin, "'Burn in' repetitions before real trials", :default => 10
|
44
|
+
opt :min_trials, "Minimum number of sample sets from each process", :default => 1
|
45
|
+
opt :max_trials, "Maximum number of sample sets from each process", :default => 20
|
46
|
+
opt :iters_per_trial, "Iterations per sample set", :default => 10
|
47
|
+
opt :print_samples, "Print all sample values for later analysis.", :default => false
|
48
|
+
opt :fail_on_divergence, "Return a non-zero code if pvalue is greater than specified."
|
49
|
+
opt :static_order, "Don't randomize the order of sampled processes per trial."
|
50
|
+
end
|
51
|
+
|
52
|
+
if ARGV.length != 2
|
53
|
+
puts "Must specify both commands as normal arguments!"
|
54
|
+
exit -1
|
55
|
+
end
|
56
|
+
|
57
|
+
command1, command2 = ARGV
|
58
|
+
|
59
|
+
# Create DSL configuration for known properties,
|
60
|
+
# but don't actually run the sampling yet.
|
61
|
+
bm_inst = ABProf.compare(:no_at_exit => true) do
|
62
|
+
pvalue OPTS[:pvalue]
|
63
|
+
burnin OPTS[:burnin]
|
64
|
+
min_trials OPTS[:min_trials]
|
65
|
+
max_trials OPTS[:max_trials]
|
66
|
+
iters_per_trial OPTS[:iters_per_trial]
|
67
|
+
bare OPTS[:bare]
|
68
|
+
debug OPTS[:debug]
|
69
|
+
static_order OPTS[:static_order]
|
70
|
+
# No fail_on_divergence - we do this manually for the CLI utilities
|
71
|
+
|
72
|
+
report_command command1
|
73
|
+
report_command command2
|
74
|
+
end
|
75
|
+
|
76
|
+
state = bm_inst.run_sampling(:print_output => true)
|
77
|
+
p_val = state[:p_tests][-1]
|
78
|
+
|
79
|
+
if OPTS[:print_samples]
|
80
|
+
puts "Samples for P1: #{state[:samples][0].inspect}"
|
81
|
+
puts "Samples for P2: #{state[:samples][1].inspect}"
|
82
|
+
end
|
83
|
+
|
84
|
+
exit 2 if (p_val >= bm_inst.p_value) && OPTS[:fail_on_divergence]
|
85
|
+
|
86
|
+
# Otherwise, return success
|
data/lib/abprof/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: abprof
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Noah Gibbs
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
data/exe/abcompare
DELETED
@@ -1 +0,0 @@
|
|
1
|
-
abprof
|