Optimization LuaJIT FFI字符串比较

Optimization LuaJIT FFI字符串比较,optimization,lua,ffi,luajit,Optimization,Lua,Ffi,Luajit,我正在绑定一个经常使用字符串状态的第三方C API。例如(伪代码): 大多数情况下,str将是一个“OK”字符串 最快的检查方法是什么 我想避免在这里实习: local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply) assert(ffi.string(reply.str, reply.len) == "OK") 我不确定它有多快。我将尝试从标准C库调用strncmp 大概是这样的: ffi.cdef [[ int strncmp (

我正在绑定一个经常使用字符串状态的第三方C API。例如(伪代码):

大多数情况下,
str
将是一个
“OK”
字符串

最快的检查方法是什么

我想避免在这里实习:

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(ffi.string(reply.str, reply.len) == "OK")

我不确定它有多快。我将尝试从标准C库调用
strncmp

大概是这样的:

ffi.cdef [[
  int strncmp ( const char * str1, const char * str2, size_t num );
]]

local ok = ffi.new("char[3]", "ok")

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(ffi.C.strncmp(ok, reply.str, reply.len) == 0)

您还可以尝试先检查
reply.len
是否为2,然后调用
memcmp
,而不是
strncmp
。它可能快一点。

不确定它是否快那么多。我将尝试从标准C库调用
strncmp

大概是这样的:

ffi.cdef [[
  int strncmp ( const char * str1, const char * str2, size_t num );
]]

local ok = ffi.new("char[3]", "ok")

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(ffi.C.strncmp(ok, reply.str, reply.len) == 0)

您还可以尝试先检查
reply.len
是否为2,然后调用
memcmp
,而不是
strncmp
。它可能会快一点。

对于短串来说,这将是LuaJIT中最快但不是最漂亮的方式

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(reply.str[0] == 79 and  -- 79 = 'O' = string.byte("O")
       reply.str[1] == 75 and -- 75 = 'K'
       reply.str[2] == 0 )

这将是最快的,但不是最漂亮的方式在卢阿吉特为短串

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(reply.str[0] == 79 and  -- 79 = 'O' = string.byte("O")
       reply.str[1] == 75 and -- 75 = 'K'
       reply.str[2] == 0 )