]> source.dussan.org Git - rspamd.git/commitdiff
[Minor] Microoptimize lua_util.str_endswith 4093/head
authorAnton Yuzhaninov <citrin+git@citrin.ru>
Sat, 26 Feb 2022 13:56:36 +0000 (13:56 +0000)
committerAnton Yuzhaninov <citrin+git@citrin.ru>
Sat, 26 Feb 2022 13:56:36 +0000 (13:56 +0000)
Use find to check string suffix instead of sub (which involves string
interning of a returned string).  Benchmarks with LuaJIT 2.1.0 shows
that an option with find is significantly faster.

While here added unit test for this function.

lualib/lua_util.lua
test/lua/unit/lua_util.misc.lua

index 308663399b9bfd8e0e2378edee520da760e4fcdb..7cabeed2d2286b44aa9a8a3953d5d14c18759369 100644 (file)
@@ -113,7 +113,7 @@ end
 -- @return {boolean} true if text ends with the specified suffix, false otherwise
 --]]
 exports.str_endswith = function(s, suffix)
-  return s:sub(-suffix:len()) == suffix
+  return s:find(suffix, -suffix:len(), true) ~= nil
 end
 
 --[[[
index b19b4d6f18636be337004b5d5665860003dbe5c9..bab44a38b694ab53608fc3df3f290d386e4dc81b 100644 (file)
@@ -27,4 +27,35 @@ context("Lua util - callback_from_string", function()
       assert_false(ret)
     end)
   end
-end)
\ No newline at end of file
+end)
+
+context("Lua util - str_endswith", function()
+  local ending = {
+    {'a', 'a'},
+    {'ab', 'b'},
+    {'ab', 'ab'},
+    {'abc', 'bc'},
+    {'any', ''},
+  }
+  local not_ending = {
+    {'a', 'b'},
+    {'', 'a'},
+    {'ab', 'a'},
+    {'ab', 'ba'},
+    {'ab', 'lab'},
+    {'abc', 'ab'},
+    {'abcd', 'bc'},
+    {'a', 'A'},
+    {'aB', 'b'},
+  }
+  for _, c in ipairs(ending) do
+    test(string.format('True case: str_endswith("%s", "%s")', c[1], c[2]), function()
+      assert_true(util.str_endswith(c[1], c[2]))
+    end)
+  end
+  for _, c in ipairs(not_ending) do
+    test(string.format('False case: str_endswith("%s", "%s")', c[1], c[2]), function()
+      assert_false(util.str_endswith(c[1], c[2]))
+    end)
+  end
+end)