Lua优化内存

5
我想优化我的代码。我有三个选项,不知道哪一个在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

第三个比第二个好,我认为,但不确定。 - itdxer
6
你想要在这里进行什么样的“优化”?如果你想要类似面向对象的结构,请使用第一个选项;如果你想要添加可从任何地方访问的全局变量,请使用第二个选项(两个函数不会很耗费资源);如果你想要在本地作用域中看到这些函数,请选择第三个选项。 - Dmitry Ledentsov
4
与优化内存有什么关系? - lhf
除了@YuHao在他的答案中告诉你的内容之外,始终记得将主要精力放在使程序:1.正确,2.可读(人类可以理解!)。在这个四核、超级优化编译器和带有许多花哨内存/速度优化的操作系统的世界中,除非你遇到非常特定的问题,否则很少需要考虑优化。但是在这种情况下,你需要成为专家(或者你需要雇用一个)。当然,如果你只是学习Lua,了解一些影响性能/内存占用的实现细节是很好的,但是“我想优化我的代码”通常对于初学者来说是一个大忌。 - Lorenzo Donati support Ukraine
我在内存资源方面受到限制,定期会出现崩溃。我不想使用优化,因为它很好。我需要它! - itdxer
你在使用eLua吗?否则,在现代计算机系统中,这些选项都不会对内存使用产生太大影响(除非你有几百万个函数)。 - dualed
3个回答

7
引用自 Lua编程宝典,程序优化的两个原则是:
  • 原则1:不要这样做。
  • 原则2:暂时不要这样做。(仅适用于专家)
回到你的例子,第二段代码稍微差一些,因为访问全局变量会更慢。但性能差异几乎不可察觉。
这取决于你的需求,第一个示例使用了额外的表格,而第三个示例的命名空间更清晰。

2

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

如果你想要性能,那么选项#3要好得多,假设你可以在本地范围内访问这些函数。


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个千字节来处理很多数学向量,但是通过使用元表将其减少到40兆字节)。

如果不涉及多次实例化的对象和表格,只是关于组织全局可访问函数,那么担心内存的问题就是荒谬的。这就像把你的lua代码全部放入一个文件中以减少文件系统开销一样。你所谈论的只是微不足道的一点节省,你应该需要一个支持详尽测量的特殊用例才会关注这个问题。

如果涉及处理,则可以通过避免使用嵌套表格和尽可能使用本地变量来获得一些小的改进。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接