1

文字列ステータスを頻繁に使用するサードパーティのCAPIをバインドしています。例(擬似コード):

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

2 に答える 2

4

それがはるかに速いかどうかはわかりません。私が試みるのはstrncmp、標準Cライブラリからを呼び出すことです。

このようなもの:

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)

また、最初に2であることを確認してから、の代わりにreply.len呼び出すこともできます。少し速いかもしれません。memcmpstrncmp

于 2012-12-23T15:42:11.133 に答える
3

これは、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-08T16:16:41.070 に答える