Luajit FFI bindings to FZY.
make
luajit benchmark.lua
Results:
Lines: 100000
Native:
-> Total: 34130
-> Time: 69.418 ms
Original:
-> Total: 34130
-> Time: 835.683 ms
The C version of fzy in that repo contains 2 differences with the original:
is_case_sensitive
additional parameters that does
what you think. It's a parameter rather than computed in the function
because for our use-case, you want to compute is_case_sensitive
once
for needle, instead of on each iteration of the loop.match_positions
uses uint32_t
for positions, because size_t
(uint64_t
) doesn't map well to lua types.The fzy algorithm requires that you call fzy.has_match(string, needle)
to
prefilter all your matches. Only after that is done you can call the other functions
such as fzy.positions(string, needle)
.