luau-performance 是一个专注于 Luau 运行时执行成本的技能,帮助开发者在确认的性能热点上做出有依据的优化决策,而不是凭感觉改写代码。
用途 当任务主要涉及 Luau 运行时开销时使用本技能:通过profile寻找真实热点;减少重复路径中的分配抖动、GC 压力与闭包创建;选择更快的表构造、查找、追加和迭代模式;让代码配合 Luau 对内建调用、方法调用和导入的快速路径;解释编译器与运行时优化如何影响热点函数;在可读性与可维护性之间平衡地调优已确认的热点路径;仅在沙箱或环境行为改变 Luau 执行或导致去优化时才考虑环境因素。
不适用场景:从零讲解 Luau 语法、控制流、表或元表;设计深层类型系统抽象、分析器行为或高级类型工具;Roblox 特有的复制、流式传输、渲染、网络、物理等引擎性能模式。此时应分别转向 luau-core、luau-types 或相应的 roblox 技能。
主要能力与决策规则 技能要求先测量:代码不简单时,先profile或基准测试再声称优化效果;先修算法成本,再做字节码级微优化;优先消除热点路径中的重复工作、重复分配和重复动态分派;性能敏感模块保持纯环境,避免 getfenv、setfenv 和 loadstring;热点代码偏好稳定的表形状、直接字段访问、直接内建调用和简单调用图;仅在测量显示可能有收益且运行时确实支持时使用环境相关的编译特性。
具体指导覆盖:定义工作负载(什么频繁运行、什么频繁分配、关键路径是什么、关注墙钟时间/帧预算/内存抖动中的哪个指标);在重复路径中减少分配压力(避免每次迭代重建表、避免循环中新建闭包、及时释放表和连接);为运行时塑造表(用字面量一次性创建字段已知的对象表、保持对象布局一致、table.create 仅用于容量已知的数组类表);刻意选择迭代方式(普通遍历用 for k, v in t do 的广义迭代,需要遇 nil 停止时用 ipairs,需要索引本身或顺序写入时用数值循环);保持内建快速路径直观(直接调用 math.max(x, y)、string.byte(s, 1) 等,不把热内建调用藏在多余间接层后,在 fastcall 依赖时优先用函数形式而非方法形式);保持调用点对编译器友好(热辅助函数用 local function,避免对捕获值的多余修改,必要时把小助手保留在模块本地以利于内联);热点代码中保持元表廉价(数据存在对象自身、__index 直接指向表、避免 __index 函数和深层查找链);把环境特性视为性能约束(getfenv、setfenv、loadstring 可能使导入和快速内建处理去优化,调试与断点可能改变可观察运行时行为,原生编译在支持处应选择性使用并测量)。
使用方式 按需查阅技能内参考文档:references/luau-performance-guide.md 了解表访问、导入、方法调用、迭代与分配感知的表构造等快速路径模型;references/profiling-guide.md 了解profile工作流、火焰图解读、函数命名归因与环境相关的profile说明;references/runtime-and-compiler-optimization-notes.md 了解编译器限制、内联、常量折叠、上值、闭包缓存与选择性原生编译;references/library-performance-sensitive-patterns.md 了解 math、string、table、迭代助手和面向数组 API 的实用选择;references/sandbox-constraints-relevant-to-runtime-behavior.md 了解会禁用或削弱运行时优化的环境规则。
适用场景与限制 适合需要在 Luau 层面对热点函数、分配行为、表结构与迭代策略进行有测量依据调优的开发者。技能附有检查清单与常见错误提醒,例如不要优化“看起来热”但未测量的代码、不要对字典使用 table.create、不要假设 pairs 或 ipairs 自动快于广义迭代、不要在没有测量的情况下到处加原生编译指令。限制:不覆盖 Luau 语法教学与类型系统设计,也不处理 Roblox 引擎层面的性能问题;具体工具链与平台细节暂未提供。