【问题标题】:Lua optimize memoryLua优化内存
【发布时间】:2013-10-11 10:09:21
【问题描述】:

我要优化我的代码。我有 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

【问题讨论】:

  • 我认为第三比第二好,但不确定
  • 你想optimize here做什么?如果您想要面向对象的结构,请使用第一个,如果您想要添加全局变量,可以从任何地方访问,请使用第二个(2 个函数并不昂贵),如果您希望函数在本地范围内可见,请使用第三个选项.
  • 这与优化内存有什么关系?
  • 除了@YuHao 在他的回答中已经告诉过您的内容之外,请始终记住将您的主要精力放在制作程序上:1.正确,2.可读(人类!)。在这个四核世界中,超级优化编译器和具有大量内存/速度优化的操作系统很少受到关注,除非您遇到非常具体的问题,但在这种情况下您需要成为专家(或者你需要雇一个)。当然,如果您只是学习 Lua,最好了解一些影响性能/内存占用的实现细节,但是“我想优化我的代码”对于初学者来说通常是一个很大的禁忌。
  • 我的内存资源有限,我会定期崩溃。我不想使用优化,因为它很好。我需要它!

标签: performance memory optimization lua


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    除非使用 #1 中的表(因此大约 40 个字节 + 每个条目一些),否则不会真正影响内存。

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

    【讨论】:

      【解决方案3】:

      如果它是关于内存使用而不是处理,并且您正在使用面向对象的编程来实例化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 用于大量数学向量,但通过使用元表)。

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

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

      【讨论】: