2013-10-04 99 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代碼放入一個文件中以減少文件系統開銷。你在談論的這種可以忽略不計的積蓄,你應該真的需要一個非常細緻的測量支持的非凡用例,甚至關心你自己。

如果是關於處理,那麼你可以通過保持你的全局函數超出嵌套表,並在可能的情況下偏好本地化來得到一些小的改進。