正如我们在前言里所说,优化是一个技巧性很强的工作,从程序是否需要优化开始,有若干个方面的内容需要考量。如果程序真的有性能问题,那么我们应该将精力集中于优化哪里和如何优化。
我们在这里讨论的技巧既不是唯一的,也不是最重要的方面。我们在这里专注于讨论专门针对Lua的优化方式,因为有很多其他的方式可以了解通用的程序优化技巧。
在本文结束之前,我还想介绍两种从更大的尺度上优化Lua程序性能的方式,但是它们都牵涉到Lua代码之外的修改。第一个是使用LuaJIT[1],一个Lua的即时编译器,由Mike Pall开发。他所作的工作非常卓越,而且LuaJIT可能是所有动态语言里最快的JIT了。使用它的代价是它只能在x86架构上运行,而且你需要一个非标准的Lua解释器(LuaJIT)来运行你的程序。所获得的好处是你可以在不修改代码的情况下让程序的运行速度提高到原先的5倍。第二个方式是将部分代码移到C中实现。这一条的重点在于为C代码选择合适的粒度。一方面,如果你把一些非常简单的函数移动到C里,Lua和C之间的通讯开销会抵消使用C编写函数带来的性能优势;另一方面,如果你把太大的函数移到C里,你又失去了Lua所提供的灵活性。最后,还要注意的是这两种方式有时候是不兼容的。你把越多的代码移到C里,LuaJIT所能带来的优化就越少。
[1] JIT即Just-in-time,在这里指即时编译器。