欢迎来到飞鸟慕鱼博客,开始您的技术之旅!
当前位置: 首页知识笔记正文

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)">end

print("start memory:"..collectgarbage("count"))
for i = 110000 do
    test(i)
end
print("result memory:"..collectgarbage("count"))

 

 第一步要把GC关掉, 以免中途引发垃圾回收影响我们对内存大小的观察. test方法中的每一行都是一种情况, 运行时请将其他行注释掉, 保持一行在执行, 每行后面的注释result momery则是在当前用法下内存大小的结果.

从上面例子的结果中, 我们看到了在对"..."应用不同的使用方式时内存变化的情况, 同样的东西, 内存占用却是从20多到800多的巨大差异, 在偶尔几次的调用中这个差异是微不足道的, 一旦被大量重复调用, 缺陷立刻被放大化, 有的方式会频繁的将"..."的内容创建为一个临时表, 在函数结束后stack上的值类型参数内容将被清空, 创建的临时表却留在了heap中, 大量临时表的出现将可能引起频繁的垃圾回收导致影响性能, 这就是应该注意的地方. 同时也看到了一些有趣的现象.

  1. 调用语句E和F, 这里没有使用"..."中的参数, 它却创建了临时表.
  2. 调用语句B, 随便应用下"...", 哪怕不真正的用它, 也不会创建临时表.
  3. 调用语句H, 一旦应用了"...", arg的临时表变量就不会被创建. 至此看出些端倪了吧, 应证了上两个现象的结果.
  4. 调用语句I, 可以看出arg临时表的内存消耗竟然快是自建表的近2倍.

知道这些规律了, 对写程序应该是很有帮助的, 可能你还在发愁为何gc会被频繁调用, 问题就在这里了.

更多讨论参见CWDG论坛:

标签:
声明:无特别说明,转载请标明本文来源!