radius-spec 0.2.0 → 0.6.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.
@@ -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
+ ```
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/gsub_vs_tr.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ [
9
+ ["No Replacement", "Any String", "m", /m/, "-"],
10
+ ["Single Replacement", "Any String", "i", /i/, "-"],
11
+ ["Multiple Replacement", "Any String", "n", /n/, "-"],
12
+ ].each do |title, str, pattern, regexp, replacement|
13
+ section title do |bench|
14
+ bench.report("gsub(string)") do
15
+ str.gsub(pattern, replacement)
16
+ end
17
+
18
+ bench.report("gsub(regexp)") do
19
+ str.gsub(regexp, replacement)
20
+ end
21
+
22
+ bench.report("tr") do
23
+ str.tr(pattern, replacement)
24
+ end
25
+ end
26
+ end
27
+
28
+ __END__
29
+
30
+ ### Environment
31
+
32
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
33
+ GC Disabled: false
34
+
35
+ ### Test Cases
36
+
37
+ #### No Replacement
38
+
39
+ ```
40
+ Warming up --------------------------------------
41
+ gsub(string) 225.903k i/100ms
42
+ gsub(regexp) 150.469k i/100ms
43
+ tr 225.874k i/100ms
44
+ Calculating -------------------------------------
45
+ gsub(string) 4.848M (± 0.7%) i/s - 24.398M in 5.042073s
46
+ gsub(regexp) 2.558M (± 1.3%) i/s - 12.790M in 5.018370s
47
+ tr 4.872M (± 1.0%) i/s - 24.394M in 5.020983s
48
+ with 95.0% confidence
49
+
50
+ Comparison:
51
+ tr: 4872264.7 i/s
52
+ gsub(string): 4847903.4 i/s - same-ish: difference falls within error
53
+ gsub(regexp): 2557821.1 i/s - 1.91x (± 0.03) slower
54
+ with 95.0% confidence
55
+ ```
56
+
57
+ #### Single Replacement
58
+
59
+ ```
60
+ Warming up --------------------------------------
61
+ gsub(string) 115.202k i/100ms
62
+ gsub(regexp) 64.609k i/100ms
63
+ tr 230.643k i/100ms
64
+ Calculating -------------------------------------
65
+ gsub(string) 1.431M (± 1.6%) i/s - 7.143M in 5.010792s
66
+ gsub(regexp) 663.965k (± 1.0%) i/s - 3.360M in 5.067248s
67
+ tr 4.517M (± 0.9%) i/s - 22.603M in 5.014505s
68
+ with 95.0% confidence
69
+
70
+ Comparison:
71
+ tr: 4516906.0 i/s
72
+ gsub(string): 1430926.3 i/s - 3.16x (± 0.06) slower
73
+ gsub(regexp): 663964.7 i/s - 6.80x (± 0.09) slower
74
+ with 95.0% confidence
75
+ ```
76
+
77
+ #### Multiple Replacement
78
+
79
+ ```
80
+ Warming up --------------------------------------
81
+ gsub(string) 92.833k i/100ms
82
+ gsub(regexp) 51.482k i/100ms
83
+ tr 222.779k i/100ms
84
+ Calculating -------------------------------------
85
+ gsub(string) 1.263M (± 1.3%) i/s - 6.313M in 5.014495s
86
+ gsub(regexp) 663.557k (± 1.4%) i/s - 3.346M in 5.061408s
87
+ tr 4.786M (± 0.9%) i/s - 24.060M in 5.040074s
88
+ with 95.0% confidence
89
+
90
+ Comparison:
91
+ tr: 4785813.8 i/s
92
+ gsub(string): 1262609.0 i/s - 3.79x (± 0.06) slower
93
+ gsub(regexp): 663557.0 i/s - 7.21x (± 0.12) slower
94
+ with 95.0% confidence
95
+ ```
@@ -0,0 +1,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/hash_merge.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ ENUM = (1..100)
9
+
10
+ def hash_merge
11
+ tmp = {}
12
+ ENUM.each do |e|
13
+ tmp.merge! e => e
14
+ end
15
+ tmp
16
+ end
17
+
18
+ def hash_assign
19
+ tmp = {}
20
+ ENUM.each do |e|
21
+ tmp[e] = e
22
+ end
23
+ tmp
24
+ end
25
+
26
+ COMPOSE = {
27
+ a: 'a',
28
+ b: 'b',
29
+ c: 'c',
30
+ }.freeze
31
+
32
+ def hash_compose_merge
33
+ { one: 1 }.merge(COMPOSE)
34
+ end
35
+
36
+ def hash_compose_merge!
37
+ { one: 1 }.merge!(COMPOSE)
38
+ end
39
+
40
+ def hash_compose_splat
41
+ { one: 1, **COMPOSE }
42
+ end
43
+
44
+ section "Hash merge vs assign" do |bench|
45
+ bench.report("Hash#merge!") do
46
+ hash_merge
47
+ end
48
+
49
+ bench.report("Hash#[]=") do
50
+ hash_assign
51
+ end
52
+ end
53
+
54
+ section "Hash compose: merge vs splat" do |bench|
55
+ bench.report("merge") do
56
+ hash_compose_merge
57
+ end
58
+
59
+ bench.report("merge!") do
60
+ hash_compose_merge!
61
+ end
62
+
63
+ bench.report("splat") do
64
+ hash_compose_splat
65
+ end
66
+ end
67
+
68
+ __END__
69
+
70
+ ### Environment
71
+
72
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
73
+ GC Disabled: false
74
+
75
+ ### Test Cases
76
+
77
+ #### Hash merge vs assign
78
+
79
+ ```
80
+ Warming up --------------------------------------
81
+ Hash#merge! 1.760k i/100ms
82
+ Hash#[]= 7.821k i/100ms
83
+ Calculating -------------------------------------
84
+ Hash#merge! 17.746k (± 1.1%) i/s - 89.760k in 5.065762s
85
+ Hash#[]= 83.691k (± 1.2%) i/s - 422.334k in 5.057697s
86
+ with 95.0% confidence
87
+
88
+ Comparison:
89
+ Hash#[]=: 83691.2 i/s
90
+ Hash#merge!: 17746.3 i/s - 4.71x (± 0.08) slower
91
+ with 95.0% confidence
92
+ ```
93
+
94
+ #### Hash compose: merge vs splat
95
+
96
+ ```
97
+ Warming up --------------------------------------
98
+ merge 78.448k i/100ms
99
+ merge! 111.435k i/100ms
100
+ splat 111.927k i/100ms
101
+ Calculating -------------------------------------
102
+ merge 978.337k (± 1.0%) i/s - 4.942M in 5.061428s
103
+ merge! 1.571M (± 1.0%) i/s - 7.912M in 5.046875s
104
+ splat 1.587M (± 1.0%) i/s - 7.947M in 5.017037s
105
+ with 95.0% confidence
106
+
107
+ Comparison:
108
+ splat: 1587073.4 i/s
109
+ merge!: 1570636.9 i/s - same-ish: difference falls within error
110
+ merge: 978337.3 i/s - 1.62x (± 0.02) slower
111
+ with 95.0% confidence
112
+ ```
@@ -0,0 +1,159 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Run from the command line: bundle exec ruby benchmarks/kwargs.rb
4
+ require_relative 'bm_setup'
5
+
6
+ display_benchmark_header
7
+
8
+ NAME = "any name"
9
+ STATIC_OPTS = { name: "any name" }.freeze
10
+
11
+ def hash_param(hash)
12
+ hash
13
+ end
14
+
15
+ def kwarg_param(name: nil)
16
+ name
17
+ end
18
+
19
+ def kwarg_splat_param(**kwargs)
20
+ kwargs
21
+ end
22
+
23
+ def static_opts
24
+ kwarg_param STATIC_OPTS
25
+ end
26
+
27
+ def named_opts
28
+ kwarg_param name: NAME
29
+ end
30
+
31
+ def splat_opts
32
+ kwarg_splat_param name: NAME
33
+ end
34
+
35
+ def hash_opts
36
+ hash_param name: NAME
37
+ end
38
+
39
+ section "kwargs vs hash method" do |x|
40
+ x.report("hash param") do
41
+ hash_opts
42
+ end
43
+
44
+ x.report("kwarg param") do
45
+ named_opts
46
+ end
47
+
48
+ x.report("kwarg splat param") do
49
+ splat_opts
50
+ end
51
+
52
+ x.compare!
53
+ end
54
+
55
+ section "Call kwargs method" do |x|
56
+ x.report("static opts") do
57
+ static_opts
58
+ end
59
+
60
+ x.report("named opts") do
61
+ named_opts
62
+ end
63
+
64
+ x.compare!
65
+ end
66
+
67
+ __END__
68
+
69
+ Perhaps surprisingly the kwarg parameters option is much faster. I'm not sure
70
+ why this actually is, but my guess is that Ruby optimizes this during the byte
71
+ code process.
72
+
73
+ ### Environment
74
+
75
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
76
+ GC Disabled: false
77
+
78
+ ### Test Cases
79
+
80
+ #### kwargs vs hash method
81
+
82
+ ```
83
+ Warming up --------------------------------------
84
+ hash param 131.753k i/100ms
85
+ kwarg param 266.657k i/100ms
86
+ kwarg splat param 66.641k i/100ms
87
+ Calculating -------------------------------------
88
+ hash param 2.057M (± 1.6%) i/s - 10.277M in 5.023252s
89
+ kwarg param 7.351M (± 0.7%) i/s - 36.799M in 5.015356s
90
+ kwarg splat param 850.179k (± 1.4%) i/s - 4.265M in 5.035194s
91
+ with 95.0% confidence
92
+
93
+ Comparison:
94
+ kwarg param: 7351007.8 i/s
95
+ hash param: 2056501.2 i/s - 3.57x (± 0.06) slower
96
+ kwarg splat param: 850179.4 i/s - 8.64x (± 0.13) slower
97
+ with 95.0% confidence
98
+ ```
99
+
100
+ #### Call kwargs method
101
+
102
+ ```
103
+ Warming up --------------------------------------
104
+ static opts 127.699k i/100ms
105
+ named opts 274.978k i/100ms
106
+ Calculating -------------------------------------
107
+ static opts 1.879M (± 1.0%) i/s - 9.450M in 5.039627s
108
+ named opts 6.938M (± 1.1%) i/s - 34.647M in 5.014500s
109
+ with 95.0% confidence
110
+
111
+ Comparison:
112
+ named opts: 6937888.3 i/s
113
+ static opts: 1878705.6 i/s - 3.69x (± 0.05) slower
114
+ with 95.0% confidence
115
+ ```
116
+
117
+ ### Environment
118
+
119
+ ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-darwin16]
120
+ GC Disabled: true
121
+
122
+ ### Test Cases
123
+
124
+ #### kwargs vs hash method
125
+
126
+ ```
127
+ Warming up --------------------------------------
128
+ hash param 144.722k i/100ms
129
+ kwarg param 266.216k i/100ms
130
+ kwarg splat param 67.212k i/100ms
131
+ Calculating -------------------------------------
132
+ hash param 2.318M (± 5.2%) i/s - 10.709M in 5.017846s
133
+ kwarg param 7.381M (± 0.8%) i/s - 37.004M in 5.026198s
134
+ kwarg splat param 893.963k (±15.1%) i/s - 3.159M in 5.180853s
135
+ with 95.0% confidence
136
+
137
+ Comparison:
138
+ kwarg param: 7380700.1 i/s
139
+ hash param: 2317626.6 i/s - 3.19x (± 0.17) slower
140
+ kwarg splat param: 893963.2 i/s - 8.26x (± 1.26) slower
141
+ with 95.0% confidence
142
+ ```
143
+
144
+ #### Call kwargs method
145
+
146
+ ```
147
+ Warming up --------------------------------------
148
+ static opts 157.568k i/100ms
149
+ named opts 271.741k i/100ms
150
+ Calculating -------------------------------------
151
+ static opts 1.741M (±12.7%) i/s - 7.091M in 5.038616s
152
+ named opts 7.335M (± 0.7%) i/s - 36.685M in 5.010800s
153
+ with 95.0% confidence
154
+
155
+ Comparison:
156
+ named opts: 7335402.3 i/s
157
+ static opts: 1740760.5 i/s - 4.21x (± 0.53) slower
158
+ with 95.0% confidence
159
+ ```