2016-07-04 22 views
2

Ich muss überprüfen, ob eine bestimmte Zeichenkette aus einem Satz vorgegebener Zeichenketten besteht.Tabellenzugriff vs Funktionsaufruf + bedingte Bestimmung: Was ist schneller?

Zwei Methoden kam es mir in dem Sinn zu tun: eine Tabelle Einrichten auf einem bestimmten Wert true zurück

local isParticular = { 
    [string1] = true, 
    [string2] = true 
} 

print(isParticular[string1]) -- true 
print(isParticular[randomString]) -- nil -> false 

Oder die Einstellung eine Funktion mit einer bedingten Bestimmung

function isParticular(s) 
    return s == string1 or s == string2 
end 

print(isParticular(string1)) -- true 
print(isParticular(randomString)) -- false 

zu überprüfen Von dem, was ich verstehe, würde die Tabellenmethode sowohl für die einzelnen Strings als auch für die verschiedenen Strings die gleiche Zeit beanspruchen, während der Funktionsaufruf wegen der Kurzschlussauswertung weniger Zeit für string1 und mehr Zeit für string2 benötigt und randomString.

Auch sind sowohl der Funktionsaufruf als auch der Tabellenzugriff dafür bekannt, dass ein wenig Overhead verursacht wird, aber vielleicht kann die Kurzschlussauswertung den Unterschied ausmachen (langsamer zu sein denke ich, besonders berücksichtigt habe ich mehr als 2 bestimmte Strings und dass die Zeichenfolge meistens nicht mit ihnen übereinstimmt).

Welche Methode sollte ich verwenden?

+0

Es gibt nur einen Weg, um sicher zu sein: Profil beide! Ich bezweifle jedoch, dass Sie einen Unterschied sehen werden: Wenn Sie in Erwägung ziehen, "oder" zu verketten, sagt das, dass Sie nicht zu viele Elemente haben, die Sie überprüfen müssen, so dass Sie sich keine Gedanken über die Skalierung machen müssen. –

Antwort

2

Eine Hashtabellen-Suche würde Ihre funktionale Suche nach einem großen Dataset übertreffen. Also, gehen Sie mit der ersten Methode:

local isParticular = { 
    string1 = true, 
    string2 = true 
} 

print(isParticular[string1]) -- true 
print(isParticular[randomString]) -- nil -> false 
+0

Nur was ich dachte! Danke für die Bestätigung. – user6245072