local n = 10000 -- length of haystack local m = 32 -- length of pattern local repeats = 100 -- number of times to repeat each test -- Test each substring starting from the rear. local function lastIndexOfSubstring(a, b) for i = #a, 1, -1 do if string.sub(a, i, i + #b - 1) == b then return i end end return -1 end -- Find all matches and return the last one. local function lastIndexOfFind(a, b) local i = -1 local j, answer repeat answer = i i, j = string.find(a, b, i + 1, true) until (i == nil) return answer end -- Reverse both strings and find the first match. local function lastIndexOfReverse(a, b) a = string.reverse(a) b = string.reverse(b) local i, j = string.find(a, b, start, true) if (i == nil) then return -1 end return #a - i - #b + 2 end local function runOneMethod(text1, text2, answer, func, name) local ms_start, ms_end local result local correct sec_start = os.clock() for x = 1, repeats do result = func(text1, text2) end sec_end = os.clock() if (result == answer) then correct = 'OK' else correct = 'FAIL, expected ' .. answer .. ', got ' .. result end print (name .. ': ' .. (sec_end - sec_start) .. 's (' .. correct .. ')') --print (sec_end - sec_start) end local function runAllMethods(text1, text2, answer) runOneMethod(text1, text2, answer, lastIndexOfSubstring, 'Substring') runOneMethod(text1, text2, answer, lastIndexOfFind, 'Find') runOneMethod(text1, text2, answer, lastIndexOfReverse, 'Reverse') end local function runTests() local haystack = '' local pattern = string.rep('a', m / 2 - 2) .. 'xy' .. string.rep('a', m / 2) local answer -- First test is to find 'aaaaxyaaaa' in 'aaaaaaaaaaaaxyaaaaaaaaaaaa' haystack = string.rep('a', n / 2 - 2) .. 'xy' .. string.rep('a', n / 2) answer = (n / 2) - (m / 2) + 1 runAllMethods(haystack, pattern, answer) -- Second test is find 'aaaaxyaaaa' in 'aaaaxyaaaaaaaaxyaaaaaaaaxyaaaa' haystack = string.rep(pattern, n / m + 1) haystack = string.sub(haystack, #haystack - n + 1, #haystack) answer = n - m + 1 runAllMethods(haystack, pattern, answer) -- Third test is to find 'aaaaxyaaaa' in 'aaaaxyaaaaaaaaaaaaaaaaaaaa' haystack = pattern .. string.rep('a', n - m) answer = 1 runAllMethods(haystack, pattern, answer) -- Fourth test is to find 'aaaaxyaaaa' in 'aaaaaaaaaaaaaaaaaaaaxyaaaa' haystack = string.rep('a', n - m) .. pattern answer = n - m + 1 runAllMethods(haystack, pattern, answer) -- Fifth test is to find 'aaaaxyaaaa' in 'aaaaaaaaaaaaaaaaaaaaaaaaaa' haystack = string.rep('a', n) answer = -1 runAllMethods(haystack, pattern, answer) end runTests()