2012-07-30 508 views
3

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

因此,如何更有效的是:

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

+1

最近的Lua版本编译成字节码,所以有些百行解析不会让如果不执行的代码很大差异的运行时,无论意味着你使用为了那个原因。 – 2012-07-30 11:57:55

+0

@BasileStarynkevitch所以没有效率检查'如果虚假然后...结束'? (我猜这种情况实际上不会如此频繁地出现*在阅读时*条件的状态是已知的,所以没有检查是有意义的。)感谢评论,顺便说一下。 – 2012-07-30 12:12:30

+1

以下是一个更大的问题:您认为重要的是什么?您正在使用*脚本语言*;性能显然不是最重要的。那么你是否有理由相信这两种模式都明显比其他模式慢?只要使用最能描述你想要为别人做的事情*阅读*代码;如果这是一个性能问题,那么你可以在*之后解决它*你知道这是一个性能问题。 – 2012-07-30 14:36:15

回答

0

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

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

+0

其中一个因素是可扩展性:我将继续添加到中央存储库,所以尽管我现在无法检测到,但我可能会在几个月的时间内。 – 2012-07-30 18:35:40

+0

然后重复相同的脚本100000次。 – kikito 2012-07-31 14:38:02

4

Lua不够聪明来转储功能的代码,所以你不会保存任何内存。

在速度方面,你在谈论不同的纳秒恰好一次每个程序的执行。 It's harming your efficiency to worry about this, which has virtually no relevance to actual performance.写出您感觉最清楚表示您的代码,而不是尝试clever。如果遇到性能问题,距离此决定将会有一百万英里。

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

+0

甚至没有垃圾收集?呃,好吧。感谢链接 - 非常有用的观点。 – 2012-07-30 18:37:18

+0

测试你自己很容易:'collectgarbage('collect')'将强制一个收集周期,'collectgarbage('count')'会告诉你Lua使用了多少内存。 – Mud 2012-07-30 18:40:25

+0

我惊喜地发现那些工作在特定的实现中。感谢您提供我需要的工具。 – 2012-07-30 18:54:53

2

如果真的是有的未使用的代码很多,你可以在需要时将其定义为字符串的集合,它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 

它的美妙之处在于编译如下需要,你真的没有浪费在换一种思路,它就像在表中存储的功能,并允许很多灵活性。

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

-1

LUA可以忽略多行由:

function dostuff() 
    blabla 
    faaaaa 

    --[[ 
    ignore this 
    and this 
    maybe this 
    this as well 
    ]]-- 
end 
相关问题