Skip to content

Commit 5b72c7a

Browse files
committed
perf(uuid) optimize builtin tailcall returns
1 parent d43175f commit 5b72c7a

File tree

2 files changed

+73
-17
lines changed

2 files changed

+73
-17
lines changed

bench.lua

+69-13
Original file line numberDiff line numberDiff line change
@@ -2,36 +2,49 @@ if not ngx or not jit then
22
error('must run in resty-cli with LuaJIT')
33
end
44

5+
--[[
6+
local v = require "jit.v"
7+
v.on("/tmp/dump.log")
8+
--]]
9+
510
-------------
611
-- Settings
712
-------------
813
local n_uuids = 1e6
914
local p_valid_uuids = 70
1015

11-
package.path = 'lib/?.lua;'..package.path
16+
package.path = 'lib/?.lua;' .. package.path
1217

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'
1621
local luajit_uuid = require 'resty.jit-uuid'
22+
1723
package.loaded['resty.jit-uuid'] = nil
24+
1825
ngx.config.nginx_configure = function() return '' end
26+
1927
local luajit_uuid_no_pcre = require 'resty.jit-uuid'
2028

2129
math.randomseed(os.time())
2230

2331
---------------------
2432
-- UUID v4 generation
2533
---------------------
34+
35+
2636
local tests = {
2737
['C binding '] = cuuid,
2838
['Pure Lua '] = lua_uuid.new,
2939
['resty-jit-uuid'] = luajit_uuid.generate_v4,
3040
['FFI binding '] = ffi_uuid.generate_random
3141
}
3242

43+
3344
local v4_results = {}
3445
local time_reference
46+
47+
3548
for k, uuid in pairs(tests) do
3649
collectgarbage()
3750

@@ -47,37 +60,47 @@ for k, uuid in pairs(tests) do
4760
end
4861
end
4962

63+
5064
for _, res in ipairs(v4_results) do
5165
res.diff = ((res.time - time_reference)/time_reference)*100
5266
end
5367

68+
5469
table.sort(v4_results, function(a, b) return a.time < b.time end)
5570

71+
5672
print(string.format('%s with %g UUIDs', jit.version, n_uuids))
5773
print('UUID v4 (random) generation')
5874
for i, result in ipairs(v4_results) do
59-
print(string.format('%d. %s\ttook:\t%fs\t%+d%%', i, result.module, result.time, result.diff))
75+
print(string.format('%d. %s\ttook:\t%fs\t%+d%%', i, result.module,
76+
result.time, result.diff))
6077
end
6178

79+
6280
---------------------
6381
-- UUID v3 generation
6482
---------------------
6583

84+
6685
-- unique names, unique namespaces: no strings interned
67-
tests = {
86+
local tests = {
6887
['resty-jit-uuid'] = assert(luajit_uuid.factory_v3('cc7da0b0-0743-11e6-968a-bfd4d8c62f62'))
6988
}
89+
90+
7091
local names = {}
7192
for i = 1, n_uuids do
7293
names[i] = ffi_uuid.generate_random()
7394
end
7495

96+
7597
local v3_results = {}
98+
99+
76100
for k, factory in pairs(tests) do
77101
collectgarbage()
78102

79103
local tstart = os.clock()
80-
local check = {}
81104
for i = 1, n_uuids do
82105
factory(names[i])
83106
end
@@ -86,32 +109,40 @@ for k, factory in pairs(tests) do
86109
v3_results[#v3_results+1] = {module = k, time = time}
87110
end
88111

112+
89113
table.sort(v3_results, function(a, b) return a.time < b.time end)
90114

115+
91116
print('\nUUID v3 (name-based and MD5) generation if supported')
92117
for i, result in ipairs(v3_results) do
93118
print(string.format('%d. %s\ttook:\t%fs', i, result.module, result.time))
94119
end
95120

121+
96122
---------------------
97123
-- UUID v5 generation
98124
---------------------
99125

126+
100127
-- unique names, unique namespaces: no strings interned
101-
tests = {
128+
local tests = {
102129
['resty-jit-uuid'] = assert(luajit_uuid.factory_v5('1b985f4a-06be-11e6-aff4-ff8d14e25128'))
103130
}
131+
132+
104133
local names = {}
105134
for i = 1, n_uuids do
106135
names[i] = ffi_uuid.generate_random()
107136
end
108137

138+
109139
local v5_results = {}
140+
141+
110142
for k, factory in pairs(tests) do
111143
collectgarbage()
112144

113145
local tstart = os.clock()
114-
local check = {}
115146
for i = 1, n_uuids do
116147
factory(names[i])
117148
end
@@ -120,56 +151,81 @@ for k, factory in pairs(tests) do
120151
v5_results[#v5_results+1] = {module = k, time = time}
121152
end
122153

154+
123155
table.sort(v5_results, function(a, b) return a.time < b.time end)
124156

157+
125158
print('\nUUID v5 (name-based and SHA-1) generation if supported')
126159
for i, result in ipairs(v5_results) do
127160
print(string.format('%d. %s\ttook:\t%fs', i, result.module, result.time))
128161
end
129162

163+
130164
-------------
131165
-- Validation
132166
-------------
133-
tests = {
167+
168+
169+
local tests = {
134170
['FFI binding '] = ffi_uuid.is_valid,
135171
['resty-jit-uuid (JIT PCRE enabled)'] = luajit_uuid.is_valid,
136172
['resty-jit-uuid (Lua patterns) '] = luajit_uuid_no_pcre.is_valid
137173
}
138174

175+
139176
local uuids = {}
140177
local p_invalid_uuids = p_valid_uuids + (100 - p_valid_uuids) / 2
178+
179+
141180
for i = 1, n_uuids do
142181
local r = math.random(0, 100)
182+
143183
if r <= p_valid_uuids then
144184
uuids[i] = ffi_uuid.generate_random()
185+
145186
elseif r <= p_invalid_uuids then
146187
uuids[i] = '03111af4-f2ee-11e5-ba5e-43ddcc7efcdZ' -- invalid UUID
188+
147189
else
148190
uuids[i] = '03111af4-f2ee-11e5-ba5e-43ddcc7efcd' -- invalid length
149191
end
150192
end
151193

194+
152195
local valid_results = {}
196+
197+
153198
for k, validate in pairs(tests) do
154199
collectgarbage()
155-
local tstart = os.clock()
200+
156201
local check = {}
202+
local tstart = os.clock()
203+
157204
for i = 1, n_uuids do
158205
local ok = validate(uuids[i])
159206
check[ok] = true
160207
end
208+
161209
-- make sure there is no false positives here
162210
if not check[true] or not check[false] then
163211
error('all validations have the same result for '..k)
164212
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+
}
166218
end
167219

220+
168221
table.sort(valid_results, function(a, b) return a.time < b.time end)
169222

223+
170224
print(string.format('\nUUID validation if supported (set of %d%% valid, %d%% invalid)',
171225
p_valid_uuids,
172226
100 - p_valid_uuids))
227+
173228
for i, result in ipairs(valid_results) do
174-
print(string.format('%d. %s\ttook:\t%fs', i, result.module, result.time))
229+
print(string.format('%d. %s\ttook:\t%fs', i,
230+
result.module, result.time))
175231
end

lib/resty/jit-uuid.lua

+4-4
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ do
149149
-- local u1 = uuid() ---> __call metamethod
150150
-- local u2 = uuid.generate_v4()
151151
function _M.generate_v4()
152-
return fmt('%s%s%s%s-%s%s-%s%s-%s%s-%s%s%s%s%s%s',
152+
return (fmt('%s%s%s%s-%s%s-%s%s-%s%s-%s%s%s%s%s%s',
153153
tohex(random(0, 255), 2),
154154
tohex(random(0, 255), 2),
155155
tohex(random(0, 255), 2),
@@ -169,7 +169,7 @@ do
169169
tohex(random(0, 255), 2),
170170
tohex(random(0, 255), 2),
171171
tohex(random(0, 255), 2),
172-
tohex(random(0, 255), 2))
172+
tohex(random(0, 255), 2)))
173173
end
174174
end
175175

@@ -282,13 +282,13 @@ do
282282

283283
local hash, ver, var = hash_fn(concat(buf, ''), name)
284284

285-
return fmt('%s-%s-%s%s-%s%s-%s', sub(hash, 1, 8),
285+
return (fmt('%s-%s-%s%s-%s%s-%s', sub(hash, 1, 8),
286286
sub(hash, 9, 12),
287287
ver,
288288
sub(hash, 15, 16),
289289
var,
290290
sub(hash, 19, 20),
291-
sub(hash, 21, 32))
291+
sub(hash, 21, 32)))
292292
end
293293
end
294294

0 commit comments

Comments
 (0)