GLib 的 ffi_call_plan 缓存
摘要
GLib 采用了 libffi 的新 ffi_call_plan 缓存,将 GClosure 调用开销降低 10-25%,并已提交合并请求以及用于性能分析的帧指针补丁。
<p><a href="https://lobste.rs/s/jw5a02/ffi_call_plan_caching_for_glib">评论</a></p>
查看缓存全文
缓存时间: 2026/07/24 19:05
# 为 GLib 实现 ffi_call_plan 缓存
来源:https://blogs.gnome.org/chergert/2026/07/24/ffi_call_plan-caching-for-glib/
跳转到正文 (https://blogs.gnome.org/chergert/2026/07/24/ffi_call_plan-caching-for-glib/#content)
大约一个月前,Anthony Green (https://atgreen.github.io/repl-yell/) 为 `libffi` (https://github.com/libffi/libffi) 添加了一个新颖的“调用计划”(call plan)。这样一来,就可以将确定调用方案所需的繁重工作缓存起来,后续调用时直接跳过这些步骤。更多细节可以阅读他们关于此功能的文章 (https://atgreen.github.io/repl-yell/posts/libffi-plan-cache/)。
对我来说,最佳情况下,`GClosure` 调用的分摊开销减少了约 25%。即便在不太理想的场景中,也能减少大约 10%。效果不错!
相关的 GLib 合并请求在此 (https://gitlab.gnome.org/GNOME/glib/-/merge_requests/5256),不过由于 CI 需要最新版本的 libffi 才能解除阻塞,可能还需要对构建系统进行一些调整。
我还对 `libffi` 打了补丁 (https://gitlab.gnome.org/-/snippets/7847),添加了帧指针(frame-pointers),这样就能从 Linux perf 展开器跨 ffi 边界进行栈回溯。如果你想以有意义的方式对系统进行性能剖析,这个功能非常方便。反复测试表明,其开销与未打补丁的版本大致相同(甚至惊人地更低)。现代 CPU 真是有趣的家伙。
## 文章导航
相似文章
libffi 的性能改进
本文详细介绍了 libffi 中的一项性能改进:将参数放置缓存为扁平移动列表(即“计划”),从而消除了每次函数调用时的冗余重新分类,在不使用 JIT 编译的情况下实现了显著的加速。
Fil-C 优化调用约定
Fil-C 优化调用约定确保 C 程序即使在恶意滥用情况下也能保持内存安全性,同时通过在常见情况下省略安全检查来保持效率。它解释了通过 panic 或定义明确的行为来处理类型违规的通用优化和寄存器传递优化。
Fil-C: Garbage In, Memory Safety Out
Fil-C 是一个完全内存安全的 C/C++ 实现,通过 LLVM IR 阶段的不可见能力(invisicaps)将指针值与边界信息捆绑,实现高兼容性,性能损失约 4 倍。
llama.cpp 中的流水线并行可能浪费你的显存
测试表明,llama.cpp 默认的流水线并行浪费显存且无速度提升;通过编译时设置 GGML_SCHED_MAX_COPIES=1 可节省大量显存,同时保持相同推理速度。
kv-cache : 避免kv cells复制 by ggerganov · Pull Request #24277 · ggml-org/llama.cpp
ggerganov的此pull request优化了llama.cpp中的kv-cache,以避免不必要的kv cells复制,从而提升推理性能。这是对开源LLM推理库llama.cpp的一个贡献。