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

我有一段Lua代码,我希望能够(有选择地)忽略它。我没有选择不阅读它的选项,有时我希望它被处理,有时不想,所以我不能只是把它注释掉(也就是说,有很多代码块,我要么选择不读任何一个,要么读全部)。我想出两种方法来实现这个(可能还有更多——我是个新手):把代码包含在一个函数中,然后调用或不调用该函数(一旦我确定我不会调用该函数,我可以将其设置为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实现很多,那么“几百行”需要有多大才能可靠地发现差异,以及应该包含哪些东西来进行最佳测试(代码块的主要用途是定义一堆可能有用的函数)?

点赞
用户312586
用户312586

尝试先选择让代码更易读的选项。如果它在您的目标机器上运行得足够快,就使用它。

如果它运行不够快,尝试另一个选项。

2012-07-30 16:43:21
用户501459
用户501459

Lua 不够智能以转储函数的代码,因此你不会节省任何内存。

就速度而言,你是在谈及每次程序执行时都发生的纳秒级别的差异担心这一点几乎与实际性能无关,这会损害你的效率 写出你认为最能清晰表达你意图的代码,不要试图变得“聪明”(http://c2.com/cgi/wiki?DoSimpleThings)。如果你遇到性能问题,它距离这个决定还有很长的路要走。

如果你想要节省内存,这在移动平台中可以理解,你可以将有条件的代码放到它自己的模块中,并且当不需要时不加载它(如果框架支持的话;例如 MOAI 支持,Corona 不支持)。

2012-07-30 16:44:16
用户1244588
用户1244588

如果有很多未使用的代码,您可以将其定义为字符串集合,并在需要时使用loadstring()加载它。将函数存储为字符串将减少初始编译时间,但大多数函数的字符串表示可能比其编译形式占用更多的内存,并且在编译时节省的内容可能在几千行之前并不显着...只是说一下。

如果您将此代码放入表中,则可以通过元表透明地编译它以最小化对重复调用的性能影响。

示例代码

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; --这里编译x的代码
ff = code.f; --这里没有编译
for i = 1, 1000 do
   print(ff(2 * i,-i)); --这里没有编译
   print(code.f(2 * i,-i)); --这里也没有编译,但表访问(较慢)
end

其乐妙处在于根据需要进行编译,您实际上不必再浪费思考它,它就像将函数存储在表中一样灵活。

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

2012-08-21 14:36:08
用户3477939
用户3477939

Lua 的多行注释可以通过以下方式来忽略:

function dostuff()
   blabla
   faaaaa

   --[[
   忽略这段注释
   还有这段
   或许这段
   还有这一段呢
   ]]--
end
2014-03-30 11:34:31