我要优化我的代码。我有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
答案 0 :(得分:7)
引自Lua Programming Gem,程序优化的两个格言:
回到你的例子,第二段代码有点糟糕,因为对全局代码的访问速度较慢。但性能差异难以察觉。
这取决于您的需求,第一个使用额外的表而不是第三个,但命名空间更清晰。
答案 1 :(得分:2)
没有真正会影响内存,除非在#1中使用一个表(所以每个条目大约有40个字节+一些)。
如果你想要它的性能,那么假设你可以在本地范围内访问所述函数,则选项#3要好得多。
答案 2 :(得分:0)
如果它是关于内存使用而不是处理,并且你正在使用面向对象的编程,你正在实例化上面显示的Test
的多个实例,那么你有第四个选项与metatables。
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()
如果你正在进行面向对象的编程,metatables可以大大节省内存(我不小心使用了超过1 GB的数学载体,只有通过这种方式将其减少到40兆字节才能使用元表)。
如果它不是关于多次实例化的对象和表,而是关于组织全局可访问的函数,那么担心内存就太荒谬了。这就像将整个lua代码放入一个文件中以减少文件系统开销。您正在谈论这种可以忽略不计的节省,您应该真正需要一个由细致测量支持的特殊用例,甚至关注自己。
如果是关于处理,那么你可以通过将全局函数保留在嵌套表之外,并在可能的情况下支持本地化来获得一些小的改进。