From 66a6c5a50ee5443d47d874a221cb2da692e5076c Mon Sep 17 00:00:00 2001 From: David Briscoe Date: Wed, 2 Mar 2022 10:30:52 -0800 Subject: [PATCH] Add comments for things that surprised me As a new user, there were things I was skeptical about and after digging in, these were my conclusions. Compared to the simple and obvious lua wiki solutions, batteries' string functions are slightly faster. GC is the same. Test local str = "hello world" local fn = function() local x = 0 if stringx.ends_with(str, "h") then x = x + 1 end if stringx.ends_with(str, "helll") then x = x + 1 end if stringx.ends_with(str, "helicopter") then x = x + 1 end end local pretty = require "inspect" print("stringx =", pretty({ time_taken = {measure.time_taken(fn, 10000)}, memory_taken = {measure.memory_taken(fn, 10000)} })) local function starts_with(str, prefix) return str:find(prefix, 1, true) == 1 end local function ends_with(str, ending) return ending == "" or str:sub(-#ending) == ending end local fn = function() local x = 0 if ends_with(str, "h") then x = x + 1 end if ends_with(str, "helll") then x = x + 1 end if ends_with(str, "helicopter") then x = x + 1 end end print("find =", pretty({ time_taken = {measure.time_taken(fn, 10000)}, memory_taken = {measure.memory_taken(fn, 10000)} })) starts_with =========== stringx = { memory_taken = { 0, 0, 0 }, time_taken = { 1.5098012518138e-007, 9.988434612751e-008, 2.1699932403862e-005 } } find = { memory_taken = { 0, 0, 0 }, time_taken = { 2.7349997544661e-007, 1.9988510757685e-007, 9.1999536380172e-006 } } ends_with ========= stringx = { memory_taken = { 0, 0, 0 }, time_taken = { 9.0479978825897e-008, 0, 2.5199959054589e-005 } } find = { memory_taken = { 0, 0, 0 }, time_taken = { 2.1833006758243e-007, 1.9988510757685e-007, 6.1000464484096e-006 } } --- set.lua | 3 +++ stringx.lua | 1 + 2 files changed, 4 insertions(+) diff --git a/set.lua b/set.lua index 4b552a9..15a3772 100644 --- a/set.lua +++ b/set.lua @@ -1,5 +1,8 @@ --[[ set type with appropriate operations + + NOTE: This is actually a unique list (ordered set). So it's more than just + a table with keys for values. ]] local path = (...):gsub("set", "") diff --git a/stringx.lua b/stringx.lua index 0afd2b9..7b6dc6a 100644 --- a/stringx.lua +++ b/stringx.lua @@ -249,6 +249,7 @@ end --check if a given string starts with another --(without garbage) +--Using loops is actually faster than string.find! function stringx.starts_with(s, prefix) for i = 1, #prefix do if s:byte(i) ~= prefix:byte(i) then