Lua

Lua 性能,内存优化

2020-02-25  本文已影响0人  ClownWang

1.字符串

  简单的说lua维护了一个table存放了所有的字符串。
  任何新创建的字符串都会先hash去table查找一下,有的话直接返回字符串的引用。
  没有的话创建个新的字符串放入table,返回新的字符串的引用。

  --引用列子
  local value = "a" 
  value  = value .."b"
  print(value )  -- 输出 'ab'
  现在 lua string这个大table里,就有了  'a'  和 'ab' 两个字符串了。value 实际引用的是 'ab'。

  --字符串的连接列子
  'x' .. 'y' .. 'z'
  这种就是 x找一回,xy找一回,xyz找一回。
  生成3个串 找3回最后table里有了'x','xy','xyz' 三个字符串了。

2.Table

3.局部变量

4.元表与元方法

因为Lua本身是没有面向对象支持的,但在项目开发中需要面向对象编程,于是很多人用Lua本身的数据结构table+元表来模拟面向对象实现类、继承、多重继承。当元方法 __index 和 __newindex 变成函数时,会因为 函数本身的复杂度导致逻辑消耗时间变多。在大型项目里是不小的性能开销。

  1. 元方法 __index 用来对表访问,访问规则:
    1.在表中查找,如果找到,返回该元素,找不到则继续。
    2.判断该表是否有元表,如果没有元表,返回 nil,有元表则继续。
    3.判断元表有没有 __index 方法,如果 __index 方法为 nil,则返回 nil;如果 __index 方法是一个表,则重复 1、2、3;如果 __index 方法是一个函数,则返回该函数的返回值。

  2. 元方法 __newindex 用来对表更新,更新规则:
    1.如果是表已存在的索引键,则直接更新,没有的话就继续。
    2.解释器就会查找__newindex 元方法:如果存在则调用这个函数而不进行赋值操作。
    3.如果不存在则直接对表赋值。

5.函数

  1. 参数优先boolean, number, string, function,少table。防止new table 频繁rehash,gc。
  2. Lua编译一个函数时,会为它生成一个原型(prototype),其中包含了函数体对应的虚拟机指令、函数用到的常量值(数,文本字符串等等)和一些调试信息。在运行时,每当Lua执行一个形如function...end 这样的表达式时,它就会创建一个新的数据对象,其中包含了相应函数原型的引用、环境(environment,用来查找全局变量的表)的引用以及一个由所有upvalue引用组成的数组,而这个数据对象就称为闭包。由此可见,函数是编译期概念,是静态的,而闭包是运行期概念,是动态的。
function f1(n)
  local function f2()
    --用来查找全局变量的表)的引用以及一个由所有upvalue引用组成的数组
    -{n}
    print(n)
  end
  n=n + 10
  return  f2
end
g1  = f1(1979)
g1()--打印出1989

上一篇 下一篇

猜你喜欢

热点阅读