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

Performance 什么';在lua中忽略代码最有效的方法是什么?,performance,lua,Performance,Lua,我有一段lua代码,我希望能够(有选择地)忽略它。我没有选择不读入它,有时我希望它被处理,有时不,所以我不能只是注释掉它(也就是说,有一大堆代码块,我可以选择不读入它们或全部读入)。我想出了两种方法来实现这一点(可能还有更多——我是一个初学者):要么将代码封装在函数中,然后调用,要么不调用函数(一旦我确定我通过了调用函数的点,我可以将其设置为nil,以释放内存),要么将代码封装在中,如果。。。结束块。前者稍有优势,因为有几个这样的块,使用前者方法可以使一个块更容易加载另一个块,即使主程序没有请求

我有一段lua代码,我希望能够(有选择地)忽略它。我没有选择不读入它,有时我希望它被处理,有时不,所以我不能只是注释掉它(也就是说,有一大堆代码块,我可以选择不读入它们或全部读入)。我想出了两种方法来实现这一点(可能还有更多——我是一个初学者):要么将代码封装在函数中,然后调用,要么不调用函数(一旦我确定我通过了调用函数的点,我可以将其设置为
nil
,以释放内存),要么将代码封装在
中,如果。。。结束
块。前者稍有优势,因为有几个这样的块,使用前者方法可以使一个块更容易加载另一个块,即使主程序没有请求它,但后者似乎更有效。然而,我知道的不多,我不知道节省效率是否值得

那么,效率有多高:

if false then
    -- a few hundred lines
end

?


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

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


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

Lua不够聪明,无法转储函数的代码,因此无法保存任何内存

就速度而言,你所说的是不同的纳秒数,每个程序执行一次。写下你觉得最能表达你意图的代码,而不要试图去表达。如果您遇到性能问题,那么距离此决策还有一百万英里远


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

如果真的有很多未使用的代码,您可以将其定义为字符串的集合,并在需要时
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; -- 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
它的美妙之处在于,它可以根据需要进行编译,而您实际上不必再浪费时间在它上面,这就像将函数存储在表中一样,允许了很大的灵活性


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

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

function dostuff()
   blabla
   faaaaa

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

最近的Lua版本正在编译为字节码,因此,如果代码没有执行,数百行解析不会对运行时产生很大影响,无论您使用什么方法。@basileStrynkevitch因此
中没有效率检查如果为false,那么。。。结束
?(我想这种情况实际上不会经常出现,以至于在读取时,条件的状态是已知的,所以没有检查是有意义的。)顺便说一下,谢谢你的评论。这里有一个更大的问题:你认为它为什么重要?您使用的是脚本语言;在你所做的事情中,表现显然不是最重要的。那么,你有理由相信这两种模式中的任何一种都会明显慢于另一种吗?只要使用最能描述你试图为阅读代码的人做什么的东西;如果这是一个性能问题,那么您可以在知道这是一个性能问题后解决它。@Nicolas我使用的是脚本语言,因为它是我可以访问的全部内容(在iPad上…)。虽然表现可能不是最重要的,但我不想故意削弱自己。另外,我正处于这样一个阶段,我现在所做的事情可能会“一成不变”,因为以后切换到另一种方法会非常烦人,所以我宁愿先把它做好。最后,作为一名数学家,务实并非易事。其中一个因素是可伸缩性:我将继续添加到中央存储库中,因此尽管我现在不会检测到它,但几个月后可能会检测到。然后重复相同的脚本100000次。即使使用垃圾收集也不会?啊,嗯。感谢这些链接-非常有用的透视图。测试自己非常容易:
collectgarbage('collect')
将强制执行一个收集周期,
collectgarbage('count')
将向您显示Lua使用了多少内存。我惊喜地发现,这些在特定的实现中都能正常工作。谢谢你给我所需要的工具。
function dostuff()
   blabla
   faaaaa

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