在lua中忽略代码的最有效方法是什么?

时间:2012-07-30 11:49:33

标签: performance lua

我有一大堆lua代码,我希望能够(有选择地)忽略它。我没有选择不读它有时候我希望它被处理,有时候不是,所以我不能只是评论它(也就是说,有一大堆代码块,我要么可以选择阅读 none 或阅读所有)。我提出了两种方法来实现它(可能还有更多 - 我非常初学者):要么将代码包含在函数中,然后调用或不调用函数(一旦我确定我是通过我将调用函数的点,我可以将其设置为nil以释放内存)或将代码括在if ... end块中。前者有一些优点,因为有几个这样的块,并且使用前一种方法使得一个块更容易加载另一个块,即使主程序没有请求它,但后者似乎更有效。但是,不知道多少,我不知道节约效率是否值得。

那么效率更高:

if false then
    -- a few hundred lines
end

大于

throwaway = function ()
    -- a few hundred lines
end
throwaway = nil  -- to ensure that both methods leave me in the same state after garbage collection

如果它在很大程度上取决于lua的实现,那么“几百行”需要多大才能可靠地发现差异,以及它应包括哪种东西以进行最佳测试(块的主要用途是定义可能有用的函数的负载)?

4 个答案:

答案 0 :(得分:4)

Lua不够智能地转储该函数的代码,所以你不会保存任何内存。

就速度而言,你说的是每个程序执行一次的不同纳秒。 It's harming your efficiency to worry about this, which has virtually no relevance to actual performance.最明确地编写您认为表达 intent 的代码,而不是clever。如果遇到性能问题,距离这个决定还有一百万英里。

如果你想节省内存,这在移动平台上是可以理解的,你可以将你的条件代码放在它自己的模块中,永远不要加载它(如果你的框架支持它;例如MOAI,Corona不会“T)。

答案 1 :(得分:2)

如果确实有 很多 未使用的代码,您可以将其定义为字符串的集合,并在需要时将其loadstring()定义。将函数存储为字符串将减少初始编译时间,但是对于大多数函数而言,字符串表示可能占用的内存比编译形式更多,编译时保存的内容在几千行之前可能并不重要......只是说。

如果将此代码放在表中,则可以通过metatable透明地编译它,以便对重复的调用产生最小的性能影响。

示例代码

local code_uncompiled = {
   f = [=[
      local x, y = ...;
      return x+y;
   ]=]
}
code = setmetatable({}, {
   __index = function(self, k)
      self[k] = assert(loadstring(code_uncompiled[k]));
      return self[k];
   end
});

local ff = code.f; -- code of x gets compiled here
ff = code.f; -- no compilation here
for i=1, 1000 do
   print( ff(2*i, -i) ); -- no compilation here either
   print( code.f(2*i, -i) ); -- no compile either, but table access (slower)
end

它的美妙之处在于它可以根据需要进行编译,而且您不必浪费其他想法,就像将函数存储在表格中一样,并且具有很大的灵活性。

此解决方案的另一个优点是,当动态加载的代码数量失控时,您可以透明地将其更改为通过metatable的__index函数按需从外部文件加载代码。此外,您可以通过使用“真实”函数填充“代码”表来混合编译和未编译的代码。

答案 2 :(得分:0)

首先尝试使代码更易读的代码。如果它在目标计算机上运行得足够快,请使用它。

如果运行速度不够快,请尝试另一个。

答案 3 :(得分:-1)

lua可以通过以下方式忽略多行:

function dostuff()
   blabla
   faaaaa

   --[[
   ignore this
   and this
   maybe this
   this as well
   ]]--
end