LuaJIT FFI 回调性能

2024-04-20

The LuaJIT FFI 文档 http://luajit.org/ext_ffi_semantics.html提到从 C 调用回 Lua 代码相对较慢,建议尽可能避免使用:

不要将回调用于性能敏感的工作:例如考虑一个数值积分例程,它需要用户定义的函数来积分。从 C 代码中调用用户定义的 Lua 函数数百万次是一个坏主意。回调开销绝对会损害性能。

对于新设计,请避免推送式 API(C 函数为每个结果重复调用回调)。相反,请使用拉式 API(重复调用 C 函数以获得新结果)。通过 FFI 从 Lua 到 C 的调用比相反的方式要快得多。大多数设计良好的库已经使用拉式 API(读/写、获取/放置)。

然而,它们并没有给人任何感觉how muchC 的回调速度较慢。如果我想加速一些使用回调的代码,如果我将其重写为使用拉式 API,我大约可以获得多少加速?有没有人有任何基准来比较使用每种 API 风格的等效功能的实现?


在我的计算机上,从 LuaJIT 到 C 的函数调用有 5 个时钟周期的开销(值得注意的是,与通过普通 C 中的函数指针调用函数一样快),而从 C 调用回 Lua 则有 135 个时钟周期的开销,慢 27 倍。话虽这么说,需要一百万次从 C 调用 Lua 的程序只会给程序的运行时间增加约 100 毫秒的开销;虽然避免 FFI 回调在主要针对缓存内数据的紧密循环中进行操作可能是值得的,但如果调用回调(例如,每个 I/O 操作一次),与I/O 本身的开销。

$ luajit-2.0.0-beta10 callback-bench.lua   
C into C          3.344 nsec/call
Lua into C        3.345 nsec/call
C into Lua       75.386 nsec/call
Lua into Lua      0.557 nsec/call
C empty loop      0.557 nsec/call
Lua empty loop    0.557 nsec/call

$ sysctl -n machdep.cpu.brand_string         
Intel(R) Core(TM) i5-3427U CPU @ 1.80GHz

基准代码:https://gist.github.com/3726661 https://gist.github.com/3726661

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LuaJIT FFI 回调性能 的相关文章

  • Matlab:获取图中点击的坐标但保留按钮回调

    我需要一个函数 它可以为我提供在图形窗口中单击的坐标以及单击的鼠标按钮 左 中 右或按下 KEY 的坐标 但我仍然想使用 uicontrol 按钮 我目前正在使用 ginput 它工作正常 但按钮回调函数没有执行 因此我认为 ginput
  • Facebook:图形 API 回调 / 实时 API / 公共 Feed API

    我正在开发一个社交媒体项目 我需要关注一些粉丝专页并收听该特定页面上发生的所有事情 我确实知道有一些数据经销商 例如GNIP http gnip com Datasift http datasift com 谁能给我提供这样的数据 我已经尝
  • KVO 区分 willChangeValueForKey 和 didChangeValueForKey - 两者都有必要吗?

    根据 Apple 自己的建议 在手动设置 KVC KVO 兼容访问器时 应该包括BOTHKVO方法willChange and didChange 这就是我在所有手动访问器方法中所做的事情 然而 observeValueForKeyPath
  • Laravel 4 - 容器类:共享函数和闭包逻辑

    我对这里讨论的问题有一个后续问题 Laravel 核心方法混乱 https stackoverflow com questions 15758936 laravel core method confusion 17295616 172956
  • 为什么回调在 Ruby on Rails 中使用符号

    我很难理解何时以及何时不应该在 Rails 中使用符号 我知道符号与没有许多方法的字符串并没有太大不同 我还知道这些符号是很好的键 因为同名的符号在内存中占据一个地址 我很难理解为什么 Rails 决定在某些情况下使用符号 如果我有回调 b
  • twitter 没有重定向到 android 应用程序中的回调 url

    我的目标是允许使用 twitter4j 登录 Twitter 我用这个作为参考 https github com Sheikh Aman Android Samples blob master 1 20Sign inWithTwitterT
  • 实现 ActiveRecord before_find

    我正在使用缓存在表中的关键字构建搜索 在表中查找用户输入的关键字之前 它会被标准化 例如 删除了一些标点符号 如 并对大小写进行了标准化 然后使用规范化的关键字来查找获取搜索结果 我目前正在使用 before filter 处理控制器中的标
  • 我熟悉 Ruby /DL,但不确定如何使用具有返回参数指针的 C 函数调用

    我在这个模块中有这个功能 require dl require dl import module LibCalendars extend DL Importer dlload cal2jd o extern int iauCal2jd in
  • 防止运行测试时优化掉未使用的静态函数

    我正在编写一个将利用 LLVM 的库 通过inkwell https github com TheDan64 inkwell 来 JIT 编译一些函数 这些函数需要能够回调我的代码中的一些 Rust 函数 我让它工作 但我的单元测试不起作用
  • 如何从 Node.js 调用 C++ 代码?

    我目前正在开发一个在服务器上运行的模拟器 并应在浏览器中显示数据 对于服务文件 通信和类似的事情 我想使用 Node js 但是 我不确定它在计算部门是否会像我希望的那样执行 所以我想用 C 开发模拟部分 模拟被划分为单独的 世界 它们都以
  • 读取 URL 查询参数值 (Vue.js)

    在 vuejs 回调 URL 中 我有一些参数值 我需要读取这个参数值 例如返回url是 http localhost 8080 sucesspage encryteddata abdeshfkkilkalidfel 9a 我努力了this
  • 使用 haskell 构建动态库并从 C++ 中使用它

    我想构建一个包含 haskell 函数的动态库 我在 Linux 上工作 想从 C 代码中调用这个动态库 我用的例子是http wiki python org moin PythonVsHaskell http wiki python or
  • Node.js 承诺、异步或只是回调

    你能向初学者解释一下 承诺 异步 和 回调 之间的区别吗 这些术语如何相互关联 这些是同一件事吗 不同的东西 我什么时候使用哪个 异步是启动计算并提供函数或注册处理程序的一般设计模式 该处理程序最终将在计算完成时使用计算结果进行调用 而不是
  • 为什么after_find和after_initialize事件的回调要将它们定义为方法?

    定义 after find 和 after initialize 事件回调的唯一方法是将它们定义为方法 如果您尝试使用第二种技术将它们声明为处理程序 它们将被默默地忽略 有人能解释一下为什么会这样吗 为什么专门针对这两个回调呢 EDIT 摘
  • unsafePerformIO 和 FFI 库初始化

    我正在为 C 中的库创建一个 FFI 模块 该模块希望在执行其他操作之前调用一个一次性 不可重入的函数 这个调用是幂等的 但是有状态的 所以我可以在每个 Haskell 调用中调用它 但它很慢 并且由于不可重入 可能会导致冲突 那么现在是使
  • 使用ActiveRecord,有没有办法在after_update期间获取记录的旧值

    使用一个简单的示例进行设置 我有 1 张桌子 Totals 保存了总和amount第二个表中每条记录的列 Things When a thing amount更新后 我想简单地将旧值和新值之间的差异添加到total sum 现在我正在减去s
  • 多个函数完成后运行回调

    我有多个耗时的函数 我想在它们全部完成后运行一个函数 例如 data x thisTakes2Seconds data y thisTakes5Seconds http post data 我熟悉 Javascript 中回调的概念 但如果
  • Haskell FFI - 你能从 Haskell 数据结构中获取 C 指针吗?

    我有很多 C 结构体 结构如下 typedef struct unsigned int a unsigned int b StructA 还有很多功能 比如 void doSomethingWith StructA StructB Stru
  • 哪种编写回调的方法更好?

    只要看看我现在写的东西 我就可以看到一个小得多 所以就代码高尔夫 http en wikipedia org wiki Code golf Option 2是更好的选择 但就哪个更干净而言 我更喜欢Option 1 我真的很喜欢社区对此的意
  • 所有AJAX请求完成时的JQuery调用函数

    我的问题是问题的变体here https stackoverflow com questions 970967 jquery ajax call function when all requests are complete 然而 有两点不

随机推荐

  • 实时获取 macOS 输出设备音频缓冲区

    我试图tapmacOS 上当前选择的输出音频设备 因此我基本上有一个直通侦听器 可以监视当前正在输出的音频流而不影响它 我想将这些数据实时复制到环形缓冲区 以便我可以单独对其进行操作 Apple 文档和 过时 SO 答案的结合令人困惑 我是
  • 使用 VS2019 和 TFS2018 vnext 构建系统

    有谁知道是否可以将 VS2019 与 TFS2018 vnext 构建系统一起使用 您无法在生成定义中选择 VS2019 但可以选择 最新 作为 Visual Studio 的版本 不幸的是 这里没有选择VS2019 我已经在安装了VS20
  • 如何构建在 Android 上运行的本机(命令行)可执行文件?

    我已经成功构建了一个使用本机 JNI 库的 Android 应用程序 GUI 但是 现在我想创建一个从命令行 root 权限 运行并且根本不使用 GUI 的可执行文件 我如何构建这样的东西 从 NDK r8d 开始 这个问题可以通过更简单的
  • 在 sqlalchemy 中,有没有一种方法可以进行排序,使空单元格位于末尾,无论排序顺序如何?

    我有一个非常标准的设置 想按列排序 someselect order by asc table1 mycol 但是 我想要行 or NULL for mycol显示在结果的末尾 有没有办法做到这一点 SQLAlchemy 有一个NULLS
  • 无法将 UIViewController 类型的值转换为 PatternDetailViewController

    我试图将视图控制器向下转换为详细视图控制器 但不能 我正在使用 Core Data 第一次 错误出现在prepareForSegue方法中 内容如下 无法将 UIViewController 类型的值 0x1b81cdc 转换为 Patte
  • 定义用于执行程序的工作目录 (C#)

    我目前正在尝试从特定文件夹启动可执行文件 我下面的代码使应用程序崩溃得很奇怪 Process p new Process p StartInfo WorkingDirectory dump p StartInfo FileName s p
  • 如何使用Python检查url是否重定向到另一个url

    我想检查目标url访问后是否会重定向 我想我可以做这样的事情 req urllib2 Request url url headers headers resp urllib2 urlopen req timeout 3 code resp
  • 具有特定长度的字符串的哈希值

    有没有一种方法可以生成字符串的哈希值 以便哈希值本身具有特定的长度 我有一个生成 41 字节哈希值 SHA 1 的函数 但我需要它最大为 33 字节 由于某些硬件限制 如果我将 41 字节哈希截断为 33 我可能 当然 失去了唯一性 或者实
  • Google Webmasters API for Java 返回空网站列表

    我编写了一个简单的站点列表查询代码 它使用 Oauth 与服务帐户基于谷歌的文档 https developers google com identity protocols OAuth2ServiceAccount 所使用的身份验证密钥文
  • AJAX 中的 GET 与 POST?

    为什么 AJAX 中有 GET 和 POST 请求 因为它无论如何都不影响页面 URL 由于数据未反映到页面 URL 因此通过 AJAX 中的 GET 传递敏感数据有何区别 您应该根据您的 Web 服务要求使用正确的 HTTP 动词 当处理
  • $(this) 在函数中不起作用

    以下代码从文件加载 html 内容 我使用这个线程 https stackoverflow com questions 168963 stop jquery load response from being cached
  • 删除所有 kubernetes 命名空间中所有 pod 的命令

    查看文档后 有一个 API 调用可以删除单个 pod 但是有没有办法删除all所有命名空间中的 Pod 没有命令可以完全按照您的要求进行操作 以下是一些势均力敌的比赛 运行任何这些命令之前请务必小心 如果您使用多个集群 请确保您连接到正确的
  • 如何使用 C# 在 Selenium WebDriver 中等待警报?

    我如何将 Selenium WebDriver 设置为在接受警报而不是 Thread Sleep 之前等待警报 作为网站 有时加载速度非常慢 有时加载速度很快 Thanks 您应该应用 webdriver 等待警报正确出现 var wait
  • azure 以编程方式设置环境变量以禁用 azure 功能

    我有一个 Azure API 和一个 Azure 函数 当某些逻辑传递到 API 时 我希望它禁用 Azure 功能 这个帖子 https stackoverflow com questions 36368786 programmatica
  • 如何检查 IP 是否位于这些子网之一

    我有大约 12600 个子网 例如 123 123 208 0 20 和一个IP 我可以使用 SQLite 数据库或数组或其他任何东西 大约一个月前有人问过一个类似的问题 但是我不是在寻找针对一个子网检查一个IP 而是针对一堆子网 显然是最
  • 我无法理解“找不到模块:错误:无法解析'fs''”

    有一点空闲时间 我尝试用我喜欢的新网络技术 Typescript Pug 和 React 重新设计我的一个旧项目 一切工作正常 直到我尝试将 pug js 添加到混合中babel plugin transform react pug 无论我
  • 在 xml 中存储 url 的正确方法?

    我将数据存储在 xml 文件中 在其中一个节点中 我必须存储一个由特殊字符 如 组成的 url 我使用 amp 而不是 并且 xml 显示没有错误 但是当我进行 SAX 解析时 节点内返回的字符串值是 之后的字符串 我猜我存储网址的方式不正
  • 在本地主机上的 laravel 中将 slack 连接到 botman

    这是我在 laravel 中的路线文件 我将任何 url 与调用闭包的 botman 相匹配 该闭包为 botman 注册一个 slack 驱动程序并监听消息 hello 在闲暇时我试图设置Request URL在使用此事件订阅下http
  • 查找或创建竞争条件

    我正在尝试使用 ActiveRecordfind or create by column 但我从 Postgres 收到错误 让我知道它有时无法找到模型 并尝试插入一个模型 保持这张表的独特性非常重要 所以我添加了一个 unique gt
  • LuaJIT FFI 回调性能

    The LuaJIT FFI 文档 http luajit org ext ffi semantics html提到从 C 调用回 Lua 代码相对较慢 建议尽可能避免使用 不要将回调用于性能敏感的工作 例如考虑一个数值积分例程 它需要用户