2013-10-04 63 views
5

我该如何优化我的代码。我有3个选项,不知道这是记忆中的Lua更好:Lua优化内存

1)

local Test = {} 
    Test.var1 = function() 
     -- Code 
    end 

    Test.var2 = function() 
     -- Code 
    end 

2)或

function var1() 
    -- Code 
end 

function var2() 
    -- Code 
end 

3)也许

local var1 = function() 
    -- Code 
end 

local var2 = function() 
    -- Code 
end 
+0

第三个比第二个我认为更好但不确定 – itdxer

+6

你想要[这里优化](http://c2.com/cgi/wiki?PrematureOptimization)?如果你想要面向对象的结构,使用第一个,如果你想添加全局变量,可以从任何地方访问,使用第二个(2个函数并不昂贵),如果你希望函数在你的本地范围内可见,使用第三个选项。 –

+4

这与优化*内存*有什么关系? – lhf

回答

7

Lua Programming Gem引用,程序优化的两条格言:

  • 规则1:不要这样做。
  • 规则2:不要这样做。 (仅适用于专家)

回到您的示例中,第二段代码稍差一些,因为访问全局代码较慢。但性能差异几乎不明显。

这取决于您的需求,第一个使用的表比第三个要多,但名称空间更清晰。

2

没有真正影响内存,禁止使用#1中的表(因此大约40字节+每个条目)。

如果你想要的性能,然后选项#3好得多,假设你可以访问本地范围内的所述功能。

0

如果是关于内存使用情况而不是处理情况,并且您正在使用面向对象编程(其中您正如上面显示的那样实例化Test的多个实例),那么您还有第4个选项带有metatables。

TestMt = {} 
TestMt.func1 = function(self, ...) 
    ... 
end 
TestMt.func2 = function(self, ...) 
    ... 
end 
TestMt.func3 = function(self, ...) 
    ... 
end 

function new_test() 
    local t = {} 
    t.data = ... 
    setmetatable(t, {__index = TestMt}) 
    return t 
end 

foo = new_test() 
foo:func1() 
foo:func2() 
foo:func3() 

如果你做的面向对象的这类编程,元表可以导致内存节省大量(我不小心用了1千兆字节一次为众多数学向量这样,既减少它下降到40兆字节通过使用metatable)。

如果它不是关于多次实例化的对象和表,而只是组织全局可访问的函数,担心这里的内存是荒谬的。这就像将整个lua代码放入一个文件中以减少文件系统开销。你在谈论的这种可以忽略不计的积蓄,你应该真的需要一个非常细致的测量支持的非凡用例,甚至关心你自己。

如果是关于处理,那么你可以通过保持你的全局函数超出嵌套表,并在可能的情况下偏好本地化来得到一些小的改进。