源码网商城,靠谱的源码在线交易网站 我的订单 购物车 帮助

源码网商城

编写高性能Lua代码的方法

  • 时间:2022-06-16 23:47 编辑: 来源: 阅读:
  • 扫一扫,手机访问
摘要:编写高性能Lua代码的方法
[b]前言[/b] Lua是一门以其性能著称的脚本语言,被广泛应用在很多方面,尤其是游戏。像《魔兽世界》的插件,手机游戏《大掌门》《神曲》《迷失之地》等都是用Lua来写的逻辑。 所以大部分时候我们不需要去考虑性能问题。Knuth有句名言:“过早优化是万恶之源”。其意思就是过早优化是不必要的,会浪费大量时间,而且容易导致代码混乱。 所以一个好的程序员在考虑优化性能前必须问自己两个问题:“我的程序真的需要优化吗?”。如果答案为是,那么再问自己:“优化哪个部分?”。 我们不能靠臆想和凭空猜测来决定优化哪个部分,代码的运行效率必须是可测量的。我们需要借助于分析器来测定性能的瓶颈,然后着手优化。优化后,我们仍然要借助于分析器来测量所做的优化是否真的有效。 我认为最好的方式是在首次编写的时候按照最佳实践去写出高性能的代码,而不是编写了一堆垃圾代码后,再考虑优化。相信工作后大家都会对事后的优化的繁琐都深有体会。 一旦你决定编写高性能的Lua代码,下文将会指出在Lua中哪些代码是可以优化的,哪些代码会是运行缓慢的,然后怎么去优化它们。 [b]使用local[/b] 在代码运行前,Lua会把源码预编译成一种中间码,类似于Java的虚拟机。这种格式然后会通过C的解释器进行解释,整个过程其实就是通过一个while循环,里面有很多的switch...case语句,一个case对应一条指令来解析。 自Lua 5.0之后,Lua采用了一种类似于寄存器的虚拟机模式。Lua用栈来储存其寄存器。每一个活动的函数,Lua都会其分配一个栈,这个栈用来储存函数里的活动记录。每一个函数的栈都可以储存至多250个寄存器,因为栈的长度是用8个比特表示的。 有了这么多的寄存器,Lua的预编译器能把所有的local变量储存在其中。这就使得Lua在获取local变量时其效率十分的高。 举个栗子: 假设a和b为local变量,a = a + b的预编译会产生一条指令:
[url=http://zh.wikipedia.org/zh/%E5%8A%A8%E6%80%81%E8%A7%84%E5%88%92]动态规划[/url]效率高的原因所在,其本质是用空间换时间。 [b]Recycling[/b] Lua自带垃圾回收器,所以我们一般不需要考虑垃圾回收的问题。 了解Lua的垃圾回收能使得我们编程的自由度更大。 Lua的垃圾回收器是一个增量运行的机制。即回收分成许多小步骤(增量的)来进行。 频繁的垃圾回收可能会降低程序的运行效率。 我们可以通过Lua的collectgarbage函数来控制垃圾回收器。 collectgarbage函数提供了多项功能:停止垃圾回收,重启垃圾回收,强制执行一次回收循环,强制执行一步垃圾回收,获取Lua占用的内存,以及两个影响垃圾回收频率和步幅的参数。 对于批处理的Lua程序来说,停止垃圾回收collectgarbage("stop")会提高效率,因为批处理程序在结束时,内存将全部被释放。 对于垃圾回收器的步幅来说,实际上很难一概而论。更快幅度的垃圾回收会消耗更多CPU,但会释放更多内存,从而也降低了CPU的分页时间。只有小心的试验,我们才知道哪种方式更适合。 [b]结语[/b] 我们应该在写代码时,按照高标准去写,尽量避免在事后进行优化。 如果真的有性能问题,我们需要用工具量化效率,找到瓶颈,然后针对其优化。当然优化过后需要再次测量,查看是否优化成功。 在优化中,我们会面临很多选择:代码可读性和运行效率,CPU换内存,内存换CPU等等。需要根据实际情况进行不断试验,来找到最终的平衡点。 最后,有两个终极武器: 第一、使用[url=http://luajit.org/]LuaJIT[/url],LuaJIT可以使你在不修改代码的情况下获得平均约5倍的加速。查看[url=http://luajit.org/performance_x86.html]LuaJIT在x86/x64下的性能提升比[/url]。 第二、将瓶颈部分用C/C++来写。因为Lua和C的天生近亲关系,使得Lua和C可以混合编程。但是C和Lua之间的通讯会抵消掉一部分C带来的优势。 注意:这两者并不是兼容的,你用C改写的Lua代码越多,LuaJIT所带来的优化幅度就越小。 [b]声明[/b] 这篇文章是基于Lua语言的创造者Roberto Ierusalimschy在[url=http://www.lua.org/gems/]Lua Programming Gems [/url]中的[url=http://www.lua.org/gems/sample.pdf]Lua Performance Tips[/url]翻译改写而来。本文没有直译,做了许多删节,可以视为一份笔记。 感谢Roberto在Lua上的辛勤劳动和付出!
  • 全部评论(0)
联系客服
客服电话:
400-000-3129
微信版

扫一扫进微信版
返回顶部