我绑定了一个使用字符串状态的第三方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")
答案 0 :(得分:4)
不确定它快得多。我想尝试的是从标准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
。它可能会快一点。
答案 1 :(得分:2)
这将是最快的,而在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 )