2010-12-04 2 views
2

In Lua kann the __index metamethod entweder eine Funktion oder eine Tabellenreferenz sein. So sind die folgenden Konstruktionen sind äquivalent:Lua: Leistung von __index als eine Funktion vs als eine Tabelle

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 baz Umsetzung langsamer sein würde.

Aber wie viel langsamer?

Ich kümmere mich nicht viel um Implementierungsunterschiede. Was ich suche, ist der "allgemeine" Vergleichsunterschied. Sprechen wir über ein lineares Inkrement, eine Größenordnung oder mehrere Ordnungen?

Um einen Kontext zu geben: Ich entwickle a oop library, wo in den häufigsten Fällen (95%) eine Tabelle reicht. Aber es gibt einen speziellen Fall, in dem ich eine Funktion brauche. Wenn ich den Unterschied kenne, kann ich entscheiden, ob ich die Bibliothek in zwei teilen will (eine schnelle und 95% der Anwendungen und ein Modul, das Funktionen für den Rest verwendet) oder einfach die Tabellenoption zugunsten der Funktion ablegen.

Dieser spezielle __index wird häufig verwendet (jedes Mal, wenn eine Instanzmethode aufgerufen wird).

Wenn das hilft, die Funktion, die ich sehr klein sein würde verwenden, ähnlich wie diese:

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

Vielen Dank.

+2

Warum profilierst du es nicht selbst? – Kknd

+0

Ich könnte es auf meinem Computer profilieren, aber ich bin nicht wirklich interessiert "wie schnell ist die Implementierung auf einem Ubuntu-Rechner mit x-Prozessoren und x-RAM". Ich möchte wissen, wie verschieden sie sind * algorithmisch *. – kikito

+0

Also ... lass mich sehen, ob ich das richtig verstehe. Sie sind nicht daran interessiert, was seine Leistung in der realen Welt ist, nur in seiner hypothetischen Leistung. Prüfen. –

Antwort

6

Algorithmisch sind sie gleich. Beide lösen die gleiche Hashtable-Suche auf, Durchschnittszeit O (1). Der Unterschied ist konstant, hauptsächlich vom Funktionsaufruf-Overhead.

Auf meinem Computer ist die Schließung ~ 2,2 mal langsamer als die Metatable-Lookup (die 2,5 mal langsamer ist als eine direkte Suche). Test auf Codepad's server, ist der Unterschied ~ 2.

Unterm Strich, auf einer schnellen Maschine (ca. 2010), fügt der Funktionsaufruf etwa ein Zehntel einer Mikrosekunde konstanten Overhead hinzu, ansonsten ist die Leistung gleich.

BTW, viel LÖVE aus Mud. :)

+0

:) Vielen Dank für Ihre freundliche Antwort. Jetzt, da ich eine Figur im Kopf habe, kann ich entscheiden. – kikito

Verwandte Themen