radius-spec 0.2.1 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/delete_vs_tr.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ [
9
+ ["No Removal", "Any String Chars", "m", ""],
10
+ ["Single Removal", "Any String Chars", "i", ""],
11
+ ["Multiple Removal", "Any String Chars", "n", ""],
12
+ ["Multi-Char Removal", "Any String Chars", "nar", ""],
13
+ ].each do |title, str, pattern, replacement|
14
+ section title do |bench|
15
+ bench.report("delete") do
16
+ str.delete(pattern)
17
+ end
18
+
19
+ bench.report("tr") do
20
+ str.tr(pattern, replacement)
21
+ end
22
+ end
23
+ end
24
+
25
+ __END__
26
+
27
+ ### Environment
28
+
29
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
30
+ GC Disabled: false
31
+
32
+ ### Test Cases
33
+
34
+ #### No Removal
35
+
36
+ ```
37
+ Warming up --------------------------------------
38
+ delete 164.989k i/100ms
39
+ tr 163.504k i/100ms
40
+ Calculating -------------------------------------
41
+ delete 2.578M (± 0.9%) i/s - 13.034M in 5.065099s
42
+ tr 2.566M (± 0.8%) i/s - 12.917M in 5.039546s
43
+ with 95.0% confidence
44
+
45
+ Comparison:
46
+ delete: 2578043.5 i/s
47
+ tr: 2565794.9 i/s - same-ish: difference falls within error
48
+ with 95.0% confidence
49
+ ```
50
+
51
+ #### Single Removal
52
+
53
+ ```
54
+ Warming up --------------------------------------
55
+ delete 169.321k i/100ms
56
+ tr 173.594k i/100ms
57
+ Calculating -------------------------------------
58
+ delete 2.779M (± 1.1%) i/s - 13.884M in 5.010559s
59
+ tr 2.721M (± 1.0%) i/s - 13.714M in 5.050566s
60
+ with 95.0% confidence
61
+
62
+ Comparison:
63
+ delete: 2778762.2 i/s
64
+ tr: 2721121.1 i/s - 1.02x (± 0.02) slower
65
+ with 95.0% confidence
66
+ ```
67
+
68
+ #### Multiple Removal
69
+
70
+ ```
71
+ Warming up --------------------------------------
72
+ delete 173.074k i/100ms
73
+ tr 171.824k i/100ms
74
+ Calculating -------------------------------------
75
+ delete 2.804M (± 1.0%) i/s - 14.019M in 5.009616s
76
+ tr 2.739M (± 1.0%) i/s - 13.746M in 5.030533s
77
+ with 95.0% confidence
78
+
79
+ Comparison:
80
+ delete: 2804348.9 i/s
81
+ tr: 2739399.1 i/s - 1.02x (± 0.01) slower
82
+ with 95.0% confidence
83
+ ```
84
+
85
+ #### Multi-Char Removal
86
+
87
+ ```
88
+ Warming up --------------------------------------
89
+ delete 165.485k i/100ms
90
+ tr 158.961k i/100ms
91
+ Calculating -------------------------------------
92
+ delete 2.547M (± 1.3%) i/s - 12.742M in 5.019971s
93
+ tr 2.507M (± 1.0%) i/s - 12.558M in 5.018688s
94
+ with 95.0% confidence
95
+
96
+ Comparison:
97
+ delete: 2547442.6 i/s
98
+ tr: 2507427.2 i/s - same-ish: difference falls within error
99
+ with 95.0% confidence
100
+ ```
@@ -0,0 +1,167 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/double_negation.rb
4
+ require_relative 'bm_setup'
5
+ require 'active_support'
6
+ require 'active_support/core_ext/object/blank'
7
+
8
+ display_benchmark_header
9
+
10
+ # rubocop:disable Style/NonNilCheck
11
+ # As this is basically a micro-benchmark we use the block with `while` idiom
12
+ [nil, [], Object.new].each do |x|
13
+ section x.inspect do |bench|
14
+ bench.report("!!") do |times|
15
+ i = 0
16
+ while i < times
17
+ !!x
18
+ i += 1
19
+ end
20
+ end
21
+
22
+ bench.report("!nil?") do |times|
23
+ i = 0
24
+ while i < times
25
+ !x.nil?
26
+ i += 1
27
+ end
28
+ end
29
+
30
+ bench.report("nil !=") do |times|
31
+ i = 0
32
+ while i < times
33
+ nil != x
34
+ i += 1
35
+ end
36
+ end
37
+
38
+ bench.report("present?") do |times|
39
+ i = 0
40
+ while i < times
41
+ x.present?
42
+ i += 1
43
+ end
44
+ end
45
+ end
46
+ end
47
+
48
+ # When performing the initial testing we used `x == nil`. However, that was
49
+ # shockingly slow for the empty array case. Because of that we inverted the
50
+ # conditional in the above condition. However, as proof of this oddity and to
51
+ # allow us to track behavior in future versions we include this additional
52
+ # benchmark showing the issue.
53
+ section "Empty array `nil` comparison" do |bench|
54
+ x = []
55
+
56
+ bench.report("!= nil") do |times|
57
+ i = 0
58
+ while i < times
59
+ nil != x
60
+ i += 1
61
+ end
62
+ end
63
+
64
+ bench.report("nil !=") do |times|
65
+ i = 0
66
+ while i < times
67
+ x != nil
68
+ i += 1
69
+ end
70
+ end
71
+ end
72
+ # rubocop:enable Style/NonNilCheck
73
+
74
+ __END__
75
+
76
+ ### Environment
77
+
78
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
79
+ GC Disabled: true
80
+
81
+ ### Test Cases
82
+
83
+ #### nil
84
+
85
+ ```
86
+ Warming up --------------------------------------
87
+ !! 320.852k i/100ms
88
+ !nil? 313.833k i/100ms
89
+ nil != 330.298k i/100ms
90
+ present? 294.813k i/100ms
91
+ Calculating -------------------------------------
92
+ !! 41.841M (± 0.6%) i/s - 207.591M in 5.000435s
93
+ !nil? 30.851M (± 0.7%) i/s - 153.464M in 5.005301s
94
+ nil != 38.424M (± 0.5%) i/s - 191.573M in 5.007580s
95
+ present? 19.660M (± 0.7%) i/s - 97.878M in 4.999761s
96
+ with 95.0% confidence
97
+
98
+ Comparison:
99
+ !!: 41841263.8 i/s
100
+ nil !=: 38424408.4 i/s - 1.09x (± 0.01) slower
101
+ !nil?: 30850983.5 i/s - 1.36x (± 0.01) slower
102
+ present?: 19660459.4 i/s - 2.13x (± 0.02) slower
103
+ with 95.0% confidence
104
+ ```
105
+
106
+ #### []
107
+
108
+ ```
109
+ Warming up --------------------------------------
110
+ !! 317.562k i/100ms
111
+ !nil? 311.181k i/100ms
112
+ nil != 319.266k i/100ms
113
+ present? 293.159k i/100ms
114
+ Calculating -------------------------------------
115
+ !! 42.487M (± 0.6%) i/s - 211.179M in 5.005333s
116
+ !nil? 31.078M (± 0.5%) i/s - 154.968M in 5.005557s
117
+ nil != 38.313M (± 0.6%) i/s - 190.283M in 5.000799s
118
+ present? 21.854M (± 0.7%) i/s - 108.762M in 5.002198s
119
+ with 95.0% confidence
120
+
121
+ Comparison:
122
+ !!: 42487427.1 i/s
123
+ nil !=: 38312618.0 i/s - 1.11x (± 0.01) slower
124
+ !nil?: 31078123.9 i/s - 1.37x (± 0.01) slower
125
+ present?: 21854143.8 i/s - 1.94x (± 0.02) slower
126
+ with 95.0% confidence
127
+ ```
128
+
129
+ #### #<Object:0x00007f9c0a968310>
130
+
131
+ ```
132
+ Warming up --------------------------------------
133
+ !! 328.432k i/100ms
134
+ !nil? 307.084k i/100ms
135
+ nil != 324.749k i/100ms
136
+ present? 261.758k i/100ms
137
+ Calculating -------------------------------------
138
+ !! 40.897M (± 0.5%) i/s - 203.628M in 5.005426s
139
+ !nil? 30.242M (± 0.6%) i/s - 150.471M in 5.000563s
140
+ nil != 39.610M (± 0.6%) i/s - 197.123M in 5.005610s
141
+ present? 12.163M (± 0.8%) i/s - 60.728M in 5.011771s
142
+ with 95.0% confidence
143
+
144
+ Comparison:
145
+ !!: 40897495.2 i/s
146
+ nil !=: 39610078.3 i/s - 1.03x (± 0.01) slower
147
+ !nil?: 30242403.1 i/s - 1.35x (± 0.01) slower
148
+ present?: 12162705.7 i/s - 3.36x (± 0.03) slower
149
+ with 95.0% confidence
150
+ ```
151
+
152
+ #### Empty array `nil` comparison
153
+
154
+ ```
155
+ Warming up --------------------------------------
156
+ != nil 326.024k i/100ms
157
+ nil != 270.805k i/100ms
158
+ Calculating -------------------------------------
159
+ != nil 40.133M (± 0.5%) i/s - 199.853M in 5.004102s
160
+ nil != 11.551M (± 0.9%) i/s - 57.681M in 5.020992s
161
+ with 95.0% confidence
162
+
163
+ Comparison:
164
+ != nil: 40133046.7 i/s
165
+ nil !=: 11551012.8 i/s - 3.47x (± 0.04) slower
166
+ with 95.0% confidence
167
+ ```
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/empty_literal.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ # rubocop:disable Style/EmptyLiteral
9
+ section "[] vs Array.new" do |bench|
10
+ bench.report("Array.new") do
11
+ Array.new
12
+ nil
13
+ end
14
+
15
+ bench.report("[]") do
16
+ []
17
+ nil
18
+ end
19
+ end
20
+
21
+ section "{} vs Hash.new" do |bench|
22
+ bench.report("Hash.new") do
23
+ Hash.new
24
+ nil
25
+ end
26
+
27
+ bench.report("{}") do
28
+ {}
29
+ nil
30
+ end
31
+ end
32
+ # rubocop:enable Style/EmptyLiteral
33
+
34
+ __END__
35
+
36
+ ### Environment
37
+
38
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
39
+ GC Disabled: false
40
+
41
+ ### Test Cases
42
+
43
+ #### [] vs Array.new
44
+
45
+ ```
46
+ Warming up --------------------------------------
47
+ Array.new 238.371k i/100ms
48
+ [] 336.249k i/100ms
49
+ Calculating -------------------------------------
50
+ Array.new 6.298M (± 1.0%) i/s - 31.465M in 5.014660s
51
+ [] 14.157M (± 0.8%) i/s - 70.612M in 5.004166s
52
+ with 95.0% confidence
53
+
54
+ Comparison:
55
+ []: 14157286.9 i/s
56
+ Array.new: 6297668.8 i/s - 2.25x (± 0.03) slower
57
+ with 95.0% confidence
58
+ ```
59
+
60
+ #### {} vs Hash.new
61
+
62
+ ```
63
+ Warming up --------------------------------------
64
+ Hash.new 140.548k i/100ms
65
+ {} 348.340k i/100ms
66
+ Calculating -------------------------------------
67
+ Hash.new 2.203M (± 1.1%) i/s - 11.103M in 5.056212s
68
+ {} 14.285M (± 0.6%) i/s - 71.410M in 5.010915s
69
+ with 95.0% confidence
70
+
71
+ Comparison:
72
+ {}: 14285184.2 i/s
73
+ Hash.new: 2202622.4 i/s - 6.49x (± 0.08) slower
74
+ with 95.0% confidence
75
+ ```
@@ -0,0 +1,58 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/format_string.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ SINGLE_TOKEN_HASH = { greeting: 'Hello' }.freeze
9
+ MULTI_TOKEN_HASH = {
10
+ greeting: 'Hello',
11
+ name: 'Benchmark',
12
+ message: 'Always a good idea to benchmark',
13
+ }.freeze
14
+
15
+ # rubocop:disable Style/FormatString
16
+ section "Format String" do |bench|
17
+ bench.report("String#%") do
18
+ '%10s' % 'hoge'
19
+ end
20
+
21
+ bench.report("format") do
22
+ format '%10s', 'hoge'
23
+ end
24
+
25
+ bench.report("sprintf") do
26
+ sprintf '%10s', 'hoge'
27
+ end
28
+ end
29
+ # rubocop:enable Style/FormatString
30
+
31
+ __END__
32
+
33
+ ### Environment
34
+
35
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
36
+ GC Disabled: false
37
+
38
+ ### Test Cases
39
+
40
+ #### Format String
41
+
42
+ ```
43
+ Warming up --------------------------------------
44
+ String#% 148.922k i/100ms
45
+ format 162.561k i/100ms
46
+ sprintf 157.745k i/100ms
47
+ Calculating -------------------------------------
48
+ String#% 2.363M (± 0.8%) i/s - 11.914M in 5.049141s
49
+ format 2.668M (± 0.8%) i/s - 13.330M in 5.002105s
50
+ sprintf 2.609M (± 0.8%) i/s - 13.093M in 5.025561s
51
+ with 95.0% confidence
52
+
53
+ Comparison:
54
+ format: 2668054.9 i/s
55
+ sprintf: 2609234.8 i/s - 1.02x (± 0.01) slower
56
+ String#%: 2363040.2 i/s - 1.13x (± 0.01) slower
57
+ with 95.0% confidence
58
+ ```
@@ -0,0 +1,160 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/format_string_token.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ SINGLE_TOKEN_HASH = { greeting: 'Hello' }.freeze
9
+ MULTI_TOKEN_HASH = {
10
+ greeting: 'Hello',
11
+ name: 'Benchmark',
12
+ message: 'Always a good idea to benchmark',
13
+ }.freeze
14
+
15
+ # rubocop:disable Style/FormatStringToken
16
+ section "Format String Token (single token - inline token hash)" do |bench|
17
+ bench.report("annotated") do
18
+ format '%<greeting>s', greeting: 'Hello'
19
+ end
20
+
21
+ bench.report("template") do
22
+ format '%{greeting}', greeting: 'Hello'
23
+ end
24
+
25
+ bench.report("unannotated") do
26
+ format '%s', 'Hello'
27
+ end
28
+ end
29
+
30
+ section "Format String Token (single token - constant token hash)" do |bench|
31
+ bench.report("annotated") do
32
+ format '%<greeting>s', SINGLE_TOKEN_HASH
33
+ end
34
+
35
+ bench.report("template") do
36
+ format '%{greeting}', SINGLE_TOKEN_HASH
37
+ end
38
+
39
+ bench.report("unannotated") do
40
+ format '%s', 'Hello'
41
+ end
42
+ end
43
+
44
+ section "Format String Token (multiple tokens - constant token hash)" do |bench|
45
+ bench.report("annotated") do
46
+ format '%<greeting>s %<name>s, %<message>s!', MULTI_TOKEN_HASH
47
+ end
48
+
49
+ bench.report("template") do
50
+ format '%{greeting} %{name}, %{message}!', MULTI_TOKEN_HASH
51
+ end
52
+
53
+ bench.report("unannotated") do
54
+ format '%s %s, %s', 'Hello', 'Benchmark!', 'Always a good idea to benchmark'
55
+ end
56
+ end
57
+ # rubocop:enable Style/FormatStringToken
58
+
59
+ section "Format String Token (annotated)" do |bench|
60
+ bench.report("inline hash") do
61
+ format '%<greeting>s', greeting: 'Hello'
62
+ end
63
+
64
+ bench.report("constant hash") do
65
+ format '%<greeting>s', SINGLE_TOKEN_HASH
66
+ end
67
+ end
68
+
69
+ __END__
70
+
71
+ ### Environment
72
+
73
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
74
+ GC Disabled: false
75
+
76
+ ### Test Cases
77
+
78
+ #### Format String Token (single token - inline token hash)
79
+
80
+ ```
81
+ Warming up --------------------------------------
82
+ annotated 88.435k i/100ms
83
+ template 87.693k i/100ms
84
+ unannotated 173.134k i/100ms
85
+ Calculating -------------------------------------
86
+ annotated 1.160M (± 1.3%) i/s - 5.837M in 5.044452s
87
+ template 1.188M (± 1.2%) i/s - 5.963M in 5.031961s
88
+ unannotated 3.053M (± 0.8%) i/s - 15.409M in 5.055505s
89
+ with 95.0% confidence
90
+
91
+ Comparison:
92
+ unannotated: 3053228.5 i/s
93
+ template: 1187997.4 i/s - 2.57x (± 0.04) slower
94
+ annotated: 1160462.9 i/s - 2.63x (± 0.04) slower
95
+ with 95.0% confidence
96
+ ```
97
+
98
+ #### Format String Token (single token - constant token hash)
99
+
100
+ ```
101
+ Warming up --------------------------------------
102
+ annotated 142.944k i/100ms
103
+ template 142.146k i/100ms
104
+ unannotated 178.653k i/100ms
105
+ Calculating -------------------------------------
106
+ annotated 2.155M (± 0.8%) i/s - 10.864M in 5.048122s
107
+ template 2.158M (± 1.0%) i/s - 10.803M in 5.016911s
108
+ unannotated 3.081M (± 0.8%) i/s - 15.543M in 5.053055s
109
+ with 95.0% confidence
110
+
111
+ Comparison:
112
+ unannotated: 3080897.8 i/s
113
+ template: 2157563.3 i/s - 1.43x (± 0.02) slower
114
+ annotated: 2155420.1 i/s - 1.43x (± 0.02) slower
115
+ with 95.0% confidence
116
+ ```
117
+
118
+ #### Format String Token (multiple tokens - constant token hash)
119
+
120
+ ```
121
+ Warming up --------------------------------------
122
+ annotated 69.462k i/100ms
123
+ template 59.389k i/100ms
124
+ unannotated 57.845k i/100ms
125
+ Calculating -------------------------------------
126
+ annotated 890.828k (± 3.4%) i/s - 4.307M in 5.042996s
127
+ template 885.637k (± 2.8%) i/s - 4.276M in 5.017872s
128
+ unannotated 1.343M (± 3.8%) i/s - 6.189M in 5.104055s
129
+ with 95.0% confidence
130
+
131
+ Comparison:
132
+ unannotated: 1342803.3 i/s
133
+ annotated: 890828.1 i/s - 1.51x (± 0.08) slower
134
+ template: 885637.5 i/s - 1.52x (± 0.07) slower
135
+ with 95.0% confidence
136
+ ```
137
+
138
+ ### Environment
139
+
140
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
141
+ GC Disabled: false
142
+
143
+ ### Test Cases
144
+
145
+ #### Format String Token (annotated)
146
+
147
+ ```
148
+ Warming up --------------------------------------
149
+ inline hash 91.059k i/100ms
150
+ constant hash 135.572k i/100ms
151
+ Calculating -------------------------------------
152
+ inline hash 1.218M (± 1.2%) i/s - 6.101M in 5.024187s
153
+ constant hash 2.135M (± 1.0%) i/s - 10.710M in 5.028115s
154
+ with 95.0% confidence
155
+
156
+ Comparison:
157
+ constant hash: 2135050.5 i/s
158
+ inline hash: 1217810.2 i/s - 1.75x (± 0.03) slower
159
+ with 95.0% confidence
160
+ ```