【问题标题】:LuaJIT FFI string comparisonLuaJIT FFI 字符串比较
【发布时间】:2012-12-10 05:18:08
【问题描述】:

我正在绑定一个经常使用字符串状态的第三方 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")

【问题讨论】:

    标签: optimization lua ffi luajit


    【解决方案1】:

    不确定它是否快得多。我会尝试从标准 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 )
      

      【讨论】:

        猜你喜欢
        • 2019-11-15
        • 2016-10-11
        • 1970-01-01
        • 2017-06-03
        • 2011-08-07
        • 2017-01-20
        • 1970-01-01
        • 2012-09-01
        • 2011-07-06
        相关资源
        最近更新 更多