2013-08-07 2 views
5

Gibt es einen Wert beim Erstellen lokaler Kopien von allgemeinen Lua-Funktionen wie print(), pairs() oder ipairs()?Gibt es einen Leistungswert beim Erstellen lokaler Kopien von Lua-Funktionen?

Beispiel:

local _print = print 
local _pairs = pairs 
local _ipairs = ipairs 

for i, v in _ipairs(someTable) do 
    _print(v) 
end 

ich einige Lua gesehen habe mit diesem geschrieben und frage mich, ob es irgendwelche Vorteile (Leistung oder aus anderen Gründen) sind dies zu tun?

Antwort

5

Die Hauptmotivation ist wahrscheinlich die Leistung, da der Zugriff auf globale Variablen eine Hashtabellensuche erfordert, während der Zugriff auf lokale Variablen dies nicht tut. Sie sollten jedoch den Unterschied in Ihrem Programm messen. Übertreib es nicht.

Beachten Sie, dass Sie keine anderen Namen verwenden müssen: Sie können local print=print usw. schreiben, damit der Rest Ihres Programms nicht wirklich wissen muss, ob diese Variablen lokal oder global sind.

Schließlich gibt es einen semantischen Unterschied, wenn Sie den Wert einer globalen Variablen in eine lokale Variable speichern: Sie tun frühe Bindung; Wenn Ihr Programm ein externes Modul aufruft, das dieselbe Funktion verwendet, verwendet es den aktuellen Wert, nicht das eingefrorene, das Sie haben. Mit anderen Worten, spätere Neudefinitionen von zB print betreffen Sie nicht.

Für eine längere Diskussion der Leistung, lesen Sie Kapitel 2 von Lua Programmming Gems.

Eine weitere Motivation für die Definition lokaler Kopien von allgemeinen Funktionen besteht darin, sie neu zu definieren und dennoch die ursprünglichen Funktionen beizubehalten.

+1

Es ist bemerkenswert, dass dies Trick kann die Leistung in LuaJIT tatsächlich * verletzen *. – Textmode

2

Dies ist ein Beispiel in Lua Programing Gems:

Zugriff auf externe Einheimischen (das heißt, Variablen, die zu einer einschließe Funktion lokal sind) nicht so schnell, wie den Zugriff auf lokale Variablen, aber es ist immer noch schneller als Zugang zu Globals. Betrachten Sie das nächste Fragment:

function foo (x) 
    for i = 1, 1000000 do 
    x = x + math.sin(i) 
    end 
    return x 
end 
print(foo(10)) 

Wir können es optimieren, indem die Sünde erklärt einmal außerhalb Funktion foo:

local sin = math.sin 
function foo (x) 
    for i = 1, 1000000 do 
    x = x + sin(i) 
    end 
    return x 
end 
print(foo(10)) 

Dieser zweite Code 30% schneller als das Original läuft ein

+2

Versuchen Sie, eine lokale Kopie von 'math' außerhalb der Schleife im ursprünglichen Code zu erstellen und den Unterschied zu sehen. – lhf

Verwandte Themen