5

我要优化我的代码。我有 3 个选项不知道哪个更适合 Lua 中的内存:

1)

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

    Test.var2 = function ()
        -- Code
    end

2) 或

function var1()
    -- Code
end

function var2()
    -- Code
end

3)或者也许

local var1 = function ()
    -- Code
end

local var2 = function ()
    -- Code
end
4

3 回答 3

7

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

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

回到您的示例,第二段代码有点糟糕,因为对全局代码的访问速度较慢。但性能差异几乎不明显。

这取决于您的需要,第一个比第三个使用额外的表,但命名空间更干净。

于 2013-10-04T12:27:45.507 回答
2

没有一个会真正影响内存,除非在#1 中使用一个表(所以大约 40 个字节 + 每个条目一些)。

如果您想要它的性能,那么选项#3 会好得多,假设您可以在本地范围内访问所述功能。

于 2013-10-04T12:49:53.207 回答
0

如果它与内存使用有关而不是处理,并且您正在使用面向对象的编程来实例化多个实例,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()

如果您正在执行面向对象的编程,元表可以节省大量内存(我不小心将超过 1 GB 的内存用于大量数学向量,但通过使用元表将其减少到 40 兆字节)。

如果不是关于多次实例化的对象和表,而只是关于组织全局可访问的函数,那么在这里担心内存是荒谬的。这就像将整个 lua 代码放在一个文件中以减少文件系统开销。您所说的节省是如此微不足道,以至于您真的需要一个由细致测量支持的非凡用例,甚至让您自己关心这一点。

如果它是关于处理的,那么您可以通过将全局函数排除在嵌套表之外并在可能的情况下支持本地函数来获得一些小的改进。

于 2015-05-05T18:41:51.980 回答