2013-10-04 20 views
5

I cosa ottimizzare il mio codice. Ho 3 opzione non si sa che è meglio per la memoria in Lua:Lua ottimizza memoria

1)

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

    Test.var2 = function() 
     -- Code 
    end 

2) O

function var1() 
    -- Code 
end 

function var2() 
    -- Code 
end 

3) O forse

local var1 = function() 
    -- Code 
end 

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

Terzo è meglio di secondo penso, ma non è sicuro – itdxer

+6

cosa vuoi [ottimizzare qui] (http://c2.com/cgi/wiki?PrematureOptimization)? Se si desidera una struttura orientata agli oggetti, utilizzare la prima, se si desidera aggiungere globali, accessibili da qualsiasi luogo, utilizzare la seconda (2 funzioni non costose), se si desidera che le funzioni siano visibili nell'ambito locale, utilizzare la terza opzione . –

+4

Com'è correlato all'ottimizzazione * della memoria *? – lhf

risposta

7

Citando da Lua Programming Gem, le due massime dell'ottimizzazione del programma:

  • Regola n. 1: non farlo.
  • Regola n. 2: non farlo ancora. (solo per esperti)

Torna ai tuoi esempi, il secondo pezzo di codice è un po 'peggiore in quanto l'accesso a quelli globali è più lento. Ma la differenza di prestazioni è appena percettibile.

Dipende dalle vostre esigenze, il primo si usa un tavolo extra rispetto alla terza, ma lo spazio dei nomi è più pulita.

2

Nessuno sarà davvero influenzare la memoria, salvo l'uso di una tabella a # 1 (quindi circa 40 byte + alcuni per ogni ingresso).

Se le sue prestazioni desiderate, quindi l'opzione # 3 è di gran lunga migliore, supponendo che si può accedere a dette funzioni presso l'ambito locale.

0

Se si tratta di utilizzo della memoria più dell'elaborazione e si utilizza la programmazione orientata agli oggetti in cui si istanziano più istanze di Test come si è mostrato in precedenza, si dispone di una quarta opzione con 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() 

Se stai facendo sorta orientata agli oggetti di programmazione, metatables possono portare a un massiccio risparmio di memoria (per sbaglio ho usato più di 1 gigabyte una volta per numerosi vettori matematici in questo modo, solo per ridurre il basso per 40 megabyte usando il metatable).

Se non si tratta di oggetti e tabelle che vengono un'istanza molte volte, e solo di organizzare le funzioni globalmente accessibili, preoccuparsi di memoria qui è ridicolo. È come inserire l'intero codice Lua in un unico file per ridurre il sovraccarico del file system. Stai parlando di risparmi così trascurabili che dovresti davvero aver bisogno di un caso di uso straordinario supportato da meticolose misurazioni per preoccuparti anche di questo.

Se si tratta di elaborazione, quindi è possibile ottenere alcuni piccoli miglioramenti, mantenendo le funzioni globali di tabelle nidificate, e favorendo i locali quando possibile.