LuaJIT FFI字符串比较。

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

ffi.cdef [[
  struct Reply { char * str; size_t len };
  Reply * doSomething();
  void freeReply(Reply * p);
]]

最常见的是 str 将是一个 "OK" 字符串。

有什么最快的方法来检查吗?

我想避免在这里使用字符串互换:

local reply = ffi.gc(ffi.C.doSomething, ffi.C.freeReply)
assert(ffi.string(reply.str, reply.len) == "OK")
点赞
用户1008957
用户1008957

我不确定它是否更快。我会尝试调用标准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。 它可能会快一点。

2012-12-23 15:42:11
用户2665205
用户2665205

以下将会是 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 )
2013-08-08 16:16:41