2012-12-23 41 views
1

我綁定了一個很大程度上使用字符串狀態的第三方C API。例如。 (僞):LuaJIT FFI字符串比較

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") 

回答

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。它可能會快一點。

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)