Lua5.1中可变参数对性能的影响
墨初 知识笔记 44阅读
在Lua开发中,我们将使用语法''来表示不确定参数的输入和返回。但是,有些用法可能会造成你以前从未注意到的性能问题,却在不知不觉中对程序的性能产生了潜移默化的影响。首先,这个例子会很直接。这个例子说明了使用“.”以不同的方式,执行一万次,就会产生内在的影响。Lua 5.1环境。收集垃圾(' Stop ')打印('初始化内存:'收集垃圾(' count '))功能测试(。)返回1 Select (1,)-结果内存30000000001返回1-br结果内存30005 br-返回1,-cresultmemory 333622.0947265625-return 1 arg[1]-dresultmemory :803.362304687-return 1-eresultmemory :3.35444921875-return 1 1 1-fresultmemory 33334921 1875-return 1,unpack(arg)-gresultmemory 33365 . 333671.-herrorattemptoindexlocal ' arg '(Anil value)-return 1 # {.}-iresultmemory 33-select(1,);返回1,{ 1 }-jresult memory 36406 . 48666866661
e="color: rgba(0, 0, 255, 1)">endprint("start memory:"..collectgarbage("count"))
for i = 1, 10000 do
test(i)
end
print("result memory:"..collectgarbage("count"))

第一步要把GC关掉, 以免中途引发垃圾回收影响我们对内存大小的观察. test方法中的每一行都是一种情况, 运行时请将其他行注释掉, 保持一行在执行, 每行后面的注释result momery则是在当前用法下内存大小的结果.
从上面例子的结果中, 我们看到了在对"..."应用不同的使用方式时内存变化的情况, 同样的东西, 内存占用却是从20多到800多的巨大差异, 在偶尔几次的调用中这个差异是微不足道的, 一旦被大量重复调用, 缺陷立刻被放大化, 有的方式会频繁的将"..."的内容创建为一个临时表, 在函数结束后stack上的值类型参数内容将被清空, 创建的临时表却留在了heap中, 大量临时表的出现将可能引起频繁的垃圾回收导致影响性能, 这就是应该注意的地方. 同时也看到了一些有趣的现象.

- 调用语句E和F, 这里没有使用"..."中的参数, 它却创建了临时表.
- 调用语句B, 随便应用下"...", 哪怕不真正的用它, 也不会创建临时表.
- 调用语句H, 一旦应用了"...", arg的临时表变量就不会被创建. 至此看出些端倪了吧, 应证了上两个现象的结果.
- 调用语句I, 可以看出arg临时表的内存消耗竟然快是自建表的近2倍.
知道这些规律了, 对写程序应该是很有帮助的, 可能你还在发愁为何gc会被频繁调用, 问题就在这里了.