3 Stimmen

Lua: Leistung von __index als Funktion gegenüber als Tabelle

In Lua kann das __index-Metamethod entweder eine Funktion oder eine Tabellenreferenz sein. Daher sind die folgenden Konstruktionen äquivalent:

foo = { a=1, b=2, c=3 }
bar = setmetatable({}, {__index = foo})
baz = setmetatable({}, {__index = function(_,x) return foo[x] end })

print(bar.a) -- 1
print(baz.b) -- 2

Es scheint, dass die Implementierung von baz langsamer wäre.

Aber wie viel langsamer?

Ich kümmere mich nicht sehr um Implementierungsunterschiede. Was ich suche, ist der 'generelle' vergleichende Unterschied. Sprechen wir über eine lineare Erhöhung, eine Größenordnung oder mehrere Größenordnungen?

Zur Einordnung: Ich entwickle eine OOP-Bibliothek, in der in den meisten Fällen (95%) eine Tabelle ausreicht. Es gibt jedoch einen bestimmten Fall, in dem ich eine Funktion benötige. Die Kenntnis des Unterschieds wird mir dabei helfen zu entscheiden, ob ich die Bibliothek 'aufteile' (eine schnelle Bibliothek, die 95% der Anwendungen abdeckt, und ein Modul, das Funktionen für den Rest verwendet) oder einfach die Tabellenoption zugunsten der Funktion fallen lasse.

Dieses spezielle __index wird häufig verwendet (immer wenn eine Instanzmethode aufgerufen wird).

Falls das hilfreich ist, wird die Funktion, die ich verwenden werde, sehr klein sein, ähnlich wie diese:

function __index(t,x) return foo[x] or bar[x] end

Vielen Dank.

8voto

Mud Punkte 26752

Algorithmisch sind sie gleich. Beide lösen sich in demselben Hashtable-Lookup auf, durchschnittliche Zeit O(1). Der Unterschied ist konstant, hauptsächlich durch den Funktionsaufruf-Overhead.

Auf meinem Rechner ist die Schlussfolgerung ungefähr 2,2-mal langsamer als der Metatabellen-Lookup (der wiederum 2,5-mal langsamer als ein direkter Lookup ist). Testet man es auf dem Server von Codepad, beträgt der Unterschied ungefähr 2.

Im Endeffekt fügt der Funktionsaufruf auf einem schnellen Rechner (circa 2010) ungefähr ein Zehntel Mikrosekunde konstanten Overhead hinzu, ansonsten ist die Leistung dieselbe.

Übrigens, viel LÖVE von Mud. :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X