【问题标题】:When using Luajit, is it better to use FFI or normal lua bindings?使用 Luajit 时,使用 FFI 还是普通的 lua 绑定更好?
【发布时间】:2013-04-14 10:49:12
【问题描述】:

我刚开始用 C++ 修改 Luajit,我发现它的 FFI 真的很容易使用,但我不确定它是否是所有(或至少大多数)情况的最佳解决方案。

那么是使用其中一个更好,还是只是偏好?

【问题讨论】:

    标签: c++ scripting lua ffi luajit


    【解决方案1】:

    WRT to C++,这里是关于调用 C++ 的 lua-l 列表中的一个线程,它涉及到这一点: http://lua-users.org/lists/lua-l/2011-07/threads.html#00492

    除了 WB 的回答:这取决于您使用的是 JIT 编译器还是解释器。您无法在某些平台上运行 JIT(例如 iOS,由于许可限制)。因此,使用 LuaJit FFI 可能不会快多少(因为使用解释器时它慢了约 8-10 倍),但 LuaJit 解释器比 Lua VM 快 2-3 倍。

    我也有兴趣从 Lua 调用 C++,目前正在评估 LuaJit。我使用 Ponder 生成 Lua 绑定。

    【讨论】:

      【解决方案2】:

      正如 LuaJIT 网站上所说,通过 FFI 绑定的 C 函数调用可以进行 JIT 编译(相对于通过 Lua C/API 的调用),因此在性能方面 FFI 肯定更好。此外,使用 FFI,您可以在 Lua 中使用本机 C 类型进行计算,这可以在某些情况下进一步提高性能 (example)。

      使用 FFI(如果您习惯于 C/API)时可能会遇到的一个问题是,您希望 C 函数返回多个值。在 Lua C/API 中这很简单,但在 FFI 的情况下,这需要一些技巧(例如,为 FFI C 调用编写包装函数)。但考虑到您获得的易用性和性能,我认为这是一个小缺点。

      还有一些安全注意事项,例如,如果您的应用程序允许第三方脚本,因为他们滥用 FFI 会很高兴地在没有警告的情况下使您的应用程序崩溃。

      【讨论】:

      • FFI 函数的另一个缺点是它们没有调用它们的 lua 状态的概念,如果您需要在该环境中更改 _GLOBAL 等,这将无济于事。还要注意 C++ 异常与 FFI。
      • 是的,但这实际上是 FFI 和 C/API 之间的区别。在 Lua C API 的情况下,您在 C 端定义绑定,而在 FFI 的情况下,您从 Lua 端定义它们。在那里你可以改变全局变量。
      • 在最后一段 - 就像在,应用程序试图提供 API 以便用户可以编写脚本,这对 FFI 可能不安全,是吗?
      猜你喜欢
      • 2016-08-11
      • 2011-08-20
      • 1970-01-01
      • 2022-07-14
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-04
      相关资源
      最近更新 更多