我有一大堆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的实现,那么“几百行”需要多大才能可靠地发现差异,以及它应包括哪种东西以进行最佳测试(块的主要用途是定义可能有用的函数的负载)?
答案 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