Lua 优化内存。

local Test = {}
    Test.var1 = function ()
        -- 代码
    end

    Test.var2 = function ()
        -- 代码
    end
  1. 或者
function var1()
    -- 代码
end

function var2()
    -- 代码
end
  1. 或者
local var1 = function ()
    -- 代码
end

local var2 = function ()
    -- 代码
end
点赞
用户1009479
用户1009479

引用自Lua Programming Gem,程序优化的两个原则:

  • 原则 #1:不要这样做。
  • 原则 #2:现在不要这样做。(仅限专家)

回到你的例子,第二段代码稍微差一些,因为全局变量的访问速度较慢。但性能差异几乎不会被注意到。

这取决于你的需求,第一个例子比第三个例子使用了额外的表,但命名空间更干净。

2013-10-04 12:27:45
用户2633831
用户2633831

如果你要选择的话,除了在选项 #1 中使用表格(需要大约 40 字节 + 每个条目所需的一些空间),其他选项都不会对内存产生真正的影响。

如果你需要高性能,那么选项 #3 是更好的选择,前提是你能够在局部作用域中访问所述的函数。

2013-10-04 12:49:53
用户88888888
用户88888888

如果涉及到内存使用而非处理,而且你正在使用面向对象编程,创建了多个 Test 的实例,正如上面所示,那么你有第四种选择,可以使用元表。

TestMt = {}
TestMt.func1 = function(self, ...)
    ...
end
TestMt.func2 = function(self, ...)
    ...
end
TestMt.func3 = function(self, ...)
    ...
end

function new_test()
    local t = {}
    t.data = ...
    setmetatable(t, {__index = TestMt})
    return t
end

foo = new_test()
foo:func1()
foo:func2()
foo:func3()

如果你正在进行面向对象的编程,那么元表可以大大节省内存(我曾经不小心使用了超过 1GB 的内存来存储大量的数学向量,但使用元表后将其减少到了 40MB)。

如果不是关于实例化多个对象和表,而只是关于组织全局可访问函数的话,在这里担心内存问题是不现实的。这就像将你的所有 Lua 代码放入一个文件中以减少文件系统开销一样。你说的节省真的微不足道,所以你需要特殊的用例和精细的测量结果来关注这个问题。

如果是关于处理问题,那么将全局函数放在嵌套表之外,并在可能的情况下使用局部变量,可以获得一些小的改进。

2015-05-05 18:41:51