W dzisiejszym poradniku, chcia?bym przedstawi? Wam p?tle. P?tla w zwyczajnej formie, wykonuje kod poni?ej i wraca do pocz?tku po czym wykonuje go jeszcze raz i tak bez ko?ca. Przejd?my do praktyk.
Na koniec dla tych co zrozumieli, jaka jest r??nica mi?dzy ipairs a pairs
pairs - jest szybsze od ipairs o 0.3 milisekundy. Mo?e to niewielka r??nica, ale w kodzie czyni du?y odst?p.
Pomiar 'z dupy'. W jakich warunkach, na jakich kluczach, na jakim sprz?cie jest szybsze? Czy jeste? pewny ?e jest szybsze? Ja jestem przeciwnego zdania.
R??nica pomi?dzy ipairs i pairs jest diametralna: ipairs iteruje po kluczach bed?cych kolejnymi liczbami naturalnymi, pairs iteruje po wszystkich kluczach.
Na koniec dla tych co zrozumieli, jaka jest r??nica mi?dzy ipairs a pairs
pairs - jest szybsze od ipairs o 0.3 milisekundy. Mo?e to niewielka r??nica, ale w kodzie czyni du?y odst?p.
Pomiar 'z dupy'. W jakich warunkach, na jakich kluczach, na jakim sprz?cie jest szybsze? Czy jeste? pewny ?e jest szybsze? Ja jestem przeciwnego zdania.
R??nica pomi?dzy ipairs i pairs jest diametralna: ipairs iteruje po kluczach bed?cych kolejnymi liczbami naturalnymi, pairs iteruje po wszystkich kluczach.
Osobiscie jestem twierdzenia, ze pairs jest szybsze od ipairs, nawet popar?em to kodem sprawdzaj?cym:
local t={}
for i=1, 1000 do
t[i]=math.random(0,1000)
end
local tick=os.clock()
for i=1, 10000 do
for i,v in pairs(t) do
t[i]=v+1
end
end
print("PAIRS: wykonano w " .. os.clock()-tick)
local tick=os.clock()
for i=1, 10000 do
for i,v in ipairs(t) do
t[i]=v+1
end
end
print("IPAIRS: wykonano w " .. os.clock()-tick)
Ca?o?? by?a testowana na lua online. R??nica jest spora, bo praktycznie 0.04 milisekundy, niby nic, ale zawsze co?, ponadto roznica bedzie sie zaczynac dopiero gdy ilosc kluczy bedzie wieksza niz 10 (przy 20 juz zaczyna uciekac jakies 0.01 ms).
Faktycznie, mea culpa, w niekt?rych sytuacjach[1] pairs jest szybsze, ale my?l?, ?e r??nica jest na tyle pomijalna, ?e nie warto na jej rzecz rezygnowa? z funkcji, przygotowanej w?asnie do tego.
A je?li tak bardzo zale?y komu? na optymalizacji p?tli, to zawsze mo?e spr?bowa? takich iteracji:
local t={}
for i=1, 1000 do
t[i]=math.random(0,1000)
end
local tick=os.clock()
for i=1, 10000 do
for i,v in pairs(t) do
t[i]=v+1
end
end
print("PAIRS: wykonano w " .. os.clock()-tick)
local tick=os.clock()
for i=1, 10000 do
for i,v in ipairs(t) do
t[i]=v+1
end
end
print("IPAIRS: wykonano w " .. os.clock()-tick)
local tick=os.clock()
for i=1, 10000 do
for i,v in next, t do
t[i]=v+1
end
end
print("next: wykonano w " .. os.clock()-tick)
local tick=os.clock()
for i=1, 10000 do
for i=1,#t do
local v=t[i]
t[i]=v+1
end
end
print("iterate: wykonano w " .. os.clock()-tick)
Wynik:
lbiegaj@valhalla:/tmp$ lua go.lua
PAIRS: wykonano w 0.55
IPAIRS: wykonano w 0.6
next: wykonano w 0.53
iterate: wykonano w 0.34
Warto te? zauwa?y?, ze przetwarzanie czegokolwiek w skrypcie przez p?? sekundy to stanowczo zbyt d?ugo i spowoduje 'przywis' threadu z kodem na ten w?asnie okres czasu. Je?li potrzeba przetwarza? du?e lub czasoch?onne p?tle to warto zrealizowa? to za pomoc? couroutines. Przyk?adowy kod przetwarzaj?cy tablic? w ten spos?b:
function loadDomy()
local tt=getTickCount()
i=0
local dbdomy
dbdomy=exports.DB:pobierzTabeleWynikow("SELECT d.id,d.biznes_id,d.descr,d.vwi,d.drzwi,d.punkt_wyjscia,d.interiorid,d.ownerid,d.owning_org,o.nazwa o...")
for __,v in ipairs(dbdomy) do
if dodajDom(v,false) then i=i+1 end
if i%6==0 then
setTimer(function() coroutine.resume(coroutine_loadDomy) end, 150, 1).
coroutine.yield()
end
end
end
-- ladowanie domow via coroutine
coroutine_loadDomy=coroutine.create(loadDomy)
coroutine.resume(coroutine_loadDomy)
Normalnie funkcja dodajDom trwa kilkana?cie milisekund i za?adowanie tysi?ca dom?w zawiesza?o wykonywanie skrypt?w na serwerze na kilka sekund. Za pomoc? wznawianej coroutine ?adowane jest po 6 dom?w z odst?pem 150ms, dzi?ki czemu inne skrypty i eventy mog? by? prawid?owo przetwarzane.
To taki offtopic, na marginesie, ale my?le ?e lepsza to metoda na optymalizacj?, ni? urywanie u?amk?w milisekund na pairs.
R??nica jest niewielka, lecz w niekt?rych przypadkach mo?e by? wi?ksza.
Podpis
Fast Life RPG |GTA V - Misje, napady na banki, wyścigi i wiele innych atrakcji|NFS - Stwórz swoją anarchię, zostań królem wyścigów, zdobywaj osiągnięcia.. Fast Life RPG - 20%
Wielebny, jeste? pewny, ?e MTA dopuszcza u?ywania funkcji coroutine? Ostatnio jak chcia?em przetestowa? funkcje os to MTA wypieprzy?o mi b??d, ?e nie znalaz?o podanych funkcji .
Wielebny, jeste? pewny, ?e MTA dopuszcza u?ywania funkcji coroutine? Ostatnio jak chcia?em przetestowa? funkcje os to MTA wypieprzy?o mi b??d, ?e nie znalaz?o podanych funkcji .
Nie mam szklanej kuli i nie zgadn? co u Ciebie nie dzia?a, ale je?li masz jaki? problem z coroutines, to mo?e oprzyj si? na tym ma?ym przyk?adzie:
local STEP=100 -- po ile naraz przerabiamy
function liczymy()
outputChatBox(" ")
outputChatBox("Liczymy do miliona bez wieszania serwera")
for i=1,1000000 do
outputDebugString("i == " .. i)
if i%STEP==0 then
setTimer(function() coroutine.resume(coroutine_liczymy) end, 50, 1)
coroutine.yield()
end
end
outputChatBox("Policzone!")
end
coroutine_liczymy=coroutine.create(liczymy)
coroutine.resume(coroutine_liczymy)
addCommandHandler ( "czysc", function()
for i = 1,10 do
outputChatBox ( " ", root )
end
end)
Takie pytanko co do tego kodu. Interesuje mnie komenda kt?r? wpisujemy aby nam wykona?o czynno??, czyli b?dzie to /czysc czy poprostu czysc? Chodzi mi czy na czacie lokalnym tak mo?na napisa?.
Nie możesz pisać nowych tematów Nie możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach