@@ -2,36 +2,49 @@ if not ngx or not jit then
2
2
error (' must run in resty-cli with LuaJIT' )
3
3
end
4
4
5
+ --[[
6
+ local v = require "jit.v"
7
+ v.on("/tmp/dump.log")
8
+ --]]
9
+
5
10
---- ---------
6
11
-- Settings
7
12
---- ---------
8
13
local n_uuids = 1e6
9
14
local p_valid_uuids = 70
10
15
11
- package.path = ' lib/?.lua;' .. package.path
16
+ package.path = ' lib/?.lua;' .. package.path
12
17
13
- local cuuid = require ' lua_uuid'
14
- local lua_uuid = require ' uuid'
15
- local ffi_uuid = require ' resty.uuid'
18
+ local cuuid = require ' lua_uuid'
19
+ local lua_uuid = require ' uuid'
20
+ local ffi_uuid = require ' resty.uuid'
16
21
local luajit_uuid = require ' resty.jit-uuid'
22
+
17
23
package.loaded [' resty.jit-uuid' ] = nil
24
+
18
25
ngx .config .nginx_configure = function () return ' ' end
26
+
19
27
local luajit_uuid_no_pcre = require ' resty.jit-uuid'
20
28
21
29
math.randomseed (os.time ())
22
30
23
31
---- -----------------
24
32
-- UUID v4 generation
25
33
---- -----------------
34
+
35
+
26
36
local tests = {
27
37
[' C binding ' ] = cuuid ,
28
38
[' Pure Lua ' ] = lua_uuid .new ,
29
39
[' resty-jit-uuid' ] = luajit_uuid .generate_v4 ,
30
40
[' FFI binding ' ] = ffi_uuid .generate_random
31
41
}
32
42
43
+
33
44
local v4_results = {}
34
45
local time_reference
46
+
47
+
35
48
for k , uuid in pairs (tests ) do
36
49
collectgarbage ()
37
50
@@ -47,37 +60,47 @@ for k, uuid in pairs(tests) do
47
60
end
48
61
end
49
62
63
+
50
64
for _ , res in ipairs (v4_results ) do
51
65
res .diff = ((res .time - time_reference )/ time_reference )* 100
52
66
end
53
67
68
+
54
69
table.sort (v4_results , function (a , b ) return a .time < b .time end )
55
70
71
+
56
72
print (string.format (' %s with %g UUIDs' , jit .version , n_uuids ))
57
73
print (' UUID v4 (random) generation' )
58
74
for i , result in ipairs (v4_results ) do
59
- print (string.format (' %d. %s\t took:\t %fs\t %+d%%' , i , result .module , result .time , result .diff ))
75
+ print (string.format (' %d. %s\t took:\t %fs\t %+d%%' , i , result .module ,
76
+ result .time , result .diff ))
60
77
end
61
78
79
+
62
80
---- -----------------
63
81
-- UUID v3 generation
64
82
---- -----------------
65
83
84
+
66
85
-- unique names, unique namespaces: no strings interned
67
- tests = {
86
+ local tests = {
68
87
[' resty-jit-uuid' ] = assert (luajit_uuid .factory_v3 (' cc7da0b0-0743-11e6-968a-bfd4d8c62f62' ))
69
88
}
89
+
90
+
70
91
local names = {}
71
92
for i = 1 , n_uuids do
72
93
names [i ] = ffi_uuid .generate_random ()
73
94
end
74
95
96
+
75
97
local v3_results = {}
98
+
99
+
76
100
for k , factory in pairs (tests ) do
77
101
collectgarbage ()
78
102
79
103
local tstart = os.clock ()
80
- local check = {}
81
104
for i = 1 , n_uuids do
82
105
factory (names [i ])
83
106
end
@@ -86,32 +109,40 @@ for k, factory in pairs(tests) do
86
109
v3_results [# v3_results + 1 ] = {module = k , time = time }
87
110
end
88
111
112
+
89
113
table.sort (v3_results , function (a , b ) return a .time < b .time end )
90
114
115
+
91
116
print (' \n UUID v3 (name-based and MD5) generation if supported' )
92
117
for i , result in ipairs (v3_results ) do
93
118
print (string.format (' %d. %s\t took:\t %fs' , i , result .module , result .time ))
94
119
end
95
120
121
+
96
122
---- -----------------
97
123
-- UUID v5 generation
98
124
---- -----------------
99
125
126
+
100
127
-- unique names, unique namespaces: no strings interned
101
- tests = {
128
+ local tests = {
102
129
[' resty-jit-uuid' ] = assert (luajit_uuid .factory_v5 (' 1b985f4a-06be-11e6-aff4-ff8d14e25128' ))
103
130
}
131
+
132
+
104
133
local names = {}
105
134
for i = 1 , n_uuids do
106
135
names [i ] = ffi_uuid .generate_random ()
107
136
end
108
137
138
+
109
139
local v5_results = {}
140
+
141
+
110
142
for k , factory in pairs (tests ) do
111
143
collectgarbage ()
112
144
113
145
local tstart = os.clock ()
114
- local check = {}
115
146
for i = 1 , n_uuids do
116
147
factory (names [i ])
117
148
end
@@ -120,56 +151,81 @@ for k, factory in pairs(tests) do
120
151
v5_results [# v5_results + 1 ] = {module = k , time = time }
121
152
end
122
153
154
+
123
155
table.sort (v5_results , function (a , b ) return a .time < b .time end )
124
156
157
+
125
158
print (' \n UUID v5 (name-based and SHA-1) generation if supported' )
126
159
for i , result in ipairs (v5_results ) do
127
160
print (string.format (' %d. %s\t took:\t %fs' , i , result .module , result .time ))
128
161
end
129
162
163
+
130
164
---- ---------
131
165
-- Validation
132
166
---- ---------
133
- tests = {
167
+
168
+
169
+ local tests = {
134
170
[' FFI binding ' ] = ffi_uuid .is_valid ,
135
171
[' resty-jit-uuid (JIT PCRE enabled)' ] = luajit_uuid .is_valid ,
136
172
[' resty-jit-uuid (Lua patterns) ' ] = luajit_uuid_no_pcre .is_valid
137
173
}
138
174
175
+
139
176
local uuids = {}
140
177
local p_invalid_uuids = p_valid_uuids + (100 - p_valid_uuids ) / 2
178
+
179
+
141
180
for i = 1 , n_uuids do
142
181
local r = math.random (0 , 100 )
182
+
143
183
if r <= p_valid_uuids then
144
184
uuids [i ] = ffi_uuid .generate_random ()
185
+
145
186
elseif r <= p_invalid_uuids then
146
187
uuids [i ] = ' 03111af4-f2ee-11e5-ba5e-43ddcc7efcdZ' -- invalid UUID
188
+
147
189
else
148
190
uuids [i ] = ' 03111af4-f2ee-11e5-ba5e-43ddcc7efcd' -- invalid length
149
191
end
150
192
end
151
193
194
+
152
195
local valid_results = {}
196
+
197
+
153
198
for k , validate in pairs (tests ) do
154
199
collectgarbage ()
155
- local tstart = os.clock ()
200
+
156
201
local check = {}
202
+ local tstart = os.clock ()
203
+
157
204
for i = 1 , n_uuids do
158
205
local ok = validate (uuids [i ])
159
206
check [ok ] = true
160
207
end
208
+
161
209
-- make sure there is no false positives here
162
210
if not check [true ] or not check [false ] then
163
211
error (' all validations have the same result for ' .. k )
164
212
end
165
- valid_results [# valid_results + 1 ] = {module = k , time = os.clock () - tstart }
213
+
214
+ valid_results [# valid_results + 1 ] = {
215
+ module = k ,
216
+ time = os.clock () - tstart
217
+ }
166
218
end
167
219
220
+
168
221
table.sort (valid_results , function (a , b ) return a .time < b .time end )
169
222
223
+
170
224
print (string.format (' \n UUID validation if supported (set of %d%% valid, %d%% invalid)' ,
171
225
p_valid_uuids ,
172
226
100 - p_valid_uuids ))
227
+
173
228
for i , result in ipairs (valid_results ) do
174
- print (string.format (' %d. %s\t took:\t %fs' , i , result .module , result .time ))
229
+ print (string.format (' %d. %s\t took:\t %fs' , i ,
230
+ result .module , result .time ))
175
231
end
0 commit comments