radius-spec 0.2.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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
+ ```