2013-10-04 16 views
5

I co do optymalizacji mojego kodu. Mam 3 opcja nie wiem co jest lepsze dla pamięci w Lua:Lua optymalizuje pamięć

1)

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

    Test.var2 = function() 
     -- Code 
    end 

2) Albo

function var1() 
    -- Code 
end 

function var2() 
    -- Code 
end 

3) czy może

local var1 = function() 
    -- Code 
end 

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

Trzecia jest lepsza niż druga myśl, ale nie jestem pewna, – itdxer

+6

co chcesz [zoptymalizować tutaj] (http://c2.com/cgi/wiki?PrematureOptimization)? Jeśli chcesz obiektowo-podobną strukturę, użyj pierwszego, jeśli chcesz dodać globale, dostępne z dowolnego miejsca, użyj drugiego (2 funkcje nie są drogie), jeśli chcesz, aby funkcje były widoczne w twoim zasięgu lokalnym, użyj trzeciej opcji . –

+4

Jak to się ma do optymalizacji * pamięci *? – lhf

Odpowiedz

7

Cytując z Lua Programming Gem, dwa maksymy optymalizacji programu:

  • Zasada # 1: Nie rób tego.
  • Zasada # 2: Nie rób tego jeszcze. (tylko dla ekspertów)

Powrót do przykładów, drugi fragment kodu jest nieco gorszy, ponieważ dostęp do globalnych jest wolniejszy. Ale różnica w wydajności jest prawie niezauważalna.

To zależy od Twoich potrzeb, pierwszy używa dodatkowej tabeli niż trzecia, ale przestrzeń nazw jest czystsza.

2

Nic tak naprawdę nie wpłynie na pamięć, z wyjątkiem korzystania z tabeli w # 1 (czyli około 40 bajtów + część na wpis).

Jeśli jego wydajność chcesz, to opcja nr 3 jest znacznie lepsza, zakładając, że masz dostęp do wspomnianych funkcji w lokalnym zasięgu.

0

Jeśli chodzi o użycie pamięci w większym stopniu niż przetwarzanie i używasz programowania obiektowego, gdzie tworzysz wiele wystąpień Test, jak pokazano powyżej, masz czwartą opcję z 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() 

Jeśli robisz obiektowego rodzaj programowania, metatables może prowadzić do ogromnych oszczędności w pamięci (I przypadkowo wykorzystane w ciągu 1 gigabajt raz dla licznych wektorów matematycznych w ten sposób, tylko zmniejszyć ją do 40 megabajtów za pomocą metatable).

Jeśli nie chodzi o obiekty i tabele, które pojawiają się wiele razy, a tylko o organizowanie funkcji dostępnych na całym świecie, martwienie się o pamięć jest śmieszne. To jak umieszczanie całego kodu lua w jednym pliku w celu zmniejszenia obciążenia systemu plików. Mówisz o tak niewielkich oszczędnościach, że naprawdę potrzebujesz nadzwyczajnego przypadku użycia, popartego drobiazgowymi pomiarami, aby nawet się tym zająć.

Jeśli chodzi o przetwarzanie, można wprowadzić drobne usprawnienia, utrzymując funkcje globalne z zagnieżdżonych tabel i preferując lokalne, jeśli to możliwe.