更新
Mike 最近为 LuaJIT 创建并发布了一个出色的轻量级分析器,您可以在 here 找到它。
更新
wiki 在这方面增加了几页,尤其是 this one,其中详细介绍了原始答案中未提及的一些额外内容,并且基于 Mike 的 mailing list post。
LuaJIT 最近推出了自己的 wiki 和 mailing list,伴随着这样的事情而来的是更多关于加速 LuaJIT 代码的宝石。
现在 wiki 很薄(但一直在寻找添加到它的人),然而,最近添加的一个很棒的页面是 a list of NYI functions。 NYI 函数会导致 JIT 退出并回退到解释器,因此很明显应该在 hotpath 上尽可能避免 NYI 函数,尤其是在循环中。
邮件列表中一些感兴趣的主题:
并且只是重复下面所说的内容(因为它很有帮助),-jv 是性能调整的最佳工具,它也应该是您进行故障排除时的第一站。
原答案
我怀疑您实际上会发现很多,主要是因为 LJ2 仍处于测试阶段,因此大多数配置文件都是天真的完成的,因为没有针对 LJ2 特定事物(如跟踪记录器)的调试挂钩。
从好的方面来说,新的 FFI 模块确实允许直接调用高分辨率计时器(或分析 API,如 VTune/CodeAnalyst),您可以通过这种方式进行分析,但更多需要扩展 LJ2 JIT 核心,这不应该太难了,因为代码很清楚并且有注释。
一个跟踪记录器命令行参数(取自here):
-jv 和 -jdump 命令是用 Lua 编写的扩展模块。他们
主要用于调试 JIT 编译器本身。为一个
它们的选项和输出格式的描述,请阅读
源代码开头的注释块。它们可以在
源码分发的lib目录或安装在jit下
目录。默认情况下,这是 /usr/local/share/luajit-2.0.0-beta8/jit
在 POSIX 系统上。
这意味着您可以使用命令中的模块代码来形成 LuaJIT 2 的分析模块的基础。
更新
随着问题的更新,这变得更容易回答了。那么让我们从源头开始吧,LuaJIT.org:
在手动优化代码之前,最好检查一下 JIT 的优化调优资源:
编译
从Running页面我们可以看到设置JIT参数的所有选项,为了优化,我们关注-O选项。 Mike 立即告诉我们启用所有优化对性能的影响最小,因此请确保在 -O3(现在是默认设置)中运行,因此对我们来说真正有价值的唯一选项是 JIT 和 Trace 阈值。
这些选项非常特定于您正在编写的代码,因此除了默认值之外没有通用的“最佳设置”,但不用说,如果您的代码有很多循环,请尝试循环展开并计时执行时间(但如果您正在寻找冷启动性能,则在每次运行之间刷新缓存)。
-jv 还有助于避免知道 issues/'fallbacks' 会导致 JIT 退出。
除了FFI tutorial 中的一些小花絮之外,该网站本身并没有提供太多关于如何编写更好或更优化的代码:
函数缓存
函数的缓存在 Lua 中是一个很好的性能提升器,但在 LuaJIT 中不太重要,因为 JIT 自己完成了大部分这些优化,需要注意的是 FFI C 的缓存函数不好,最好缓存它们所在的命名空间。
页面示例:
不好:
local funca, funcb = ffi.C.funcb, ffi.C.funcb -- Not helpful!
local function foo(x, n)
for i=1,n do funcb(funca(x, i), 1) end
end
好:
local C = ffi.C -- Instead use this!
local function foo(x, n)
for i=1,n do C.funcb(C.funca(x, i), 1) end
end
FFI 性能问题
Status 部分详细介绍了降低代码性能的各种构造和操作(主要是因为它们未编译,而是使用 VM 回退)。
现在我们转到所有 LuaJIT gem 的 源,Lua mailing list:
小花絮:
分析工具可用于普通 Lua,但是,有一个较新的项目与 LuaJIT 正式兼容(我怀疑它会考虑任何 LuaJIT 功能)luatrace。 Lua wiki 在optimization tips 上也有一个普通 Lua 页面,需要在 LuaJIT 下测试它们的有效性(这些优化中的大部分可能已经在内部执行),但是,LuaJIT 仍然使用默认 GC,这就离开了作为手动优化收益仍然可以很大的一个领域(直到 Mike 添加了他在这里和那里提到的自定义 GC)。
LuaJIT 的源代码包含一些用于调整 JIT 内部的设置,但是,这些设置需要大量测试来调整它们以适应特定代码,
事实上,完全避免它们可能会更好,尤其是对于那些
不熟悉 JIT 的内部结构。