Hier besteht die Voraussetzung, dass der effizienteste Weg ist, viele "Enthält das Array X?" Bei Checks wird das Array in einen Hash konvertiert. Die Effizienz hängt von der knappen Ressource ab, oft von Zeit, manchmal von Platz und manchmal von Programmieraufwand. Sie verdoppeln mindestens den Speicherbedarf, indem Sie gleichzeitig eine Liste und einen Hash der Liste führen. Außerdem schreiben Sie mehr Originalcode, den Sie testen, dokumentieren usw. müssen.
Als Alternative Blick auf die Liste :: MoreUtils Modul, speziell die Funktionen any()
, none()
, true()
und false()
. Sie alle nehmen einen Block als Bedingung und eine Liste als Argument, ähnlich map()
und grep()
:
print "At least one value undefined" if any { !defined($_) } @list;
Ich führte einen Schnelltest durch, lud die Hälfte von / usr / share / dict / words in ein Array (25000 Wörter) und suchte dann nach elf Wörtern, die aus dem gesamten Wörterbuch (alle 5000. Wörter) im Array ausgewählt wurden, wobei beide Arrays verwendet wurden -to-Hash-Methode und die any()
Funktion von List :: MoreUtils.
Unter Perl 5.8.8, das aus dem Quellcode erstellt wurde, wird die Array-to-Hash-Methode fast 1100-mal schneller ausgeführt als die any()
Methode (1300-mal schneller unter Ubuntu 6.06s Perl 5.8.7).
Dies ist jedoch nicht die ganze Geschichte - die Umwandlung von Array in Hash dauert etwa 0,04 Sekunden, was in diesem Fall die Zeiteffizienz der Array-zu-Hash-Methode auf 1,5x-2x schneller als die any()
Methode verringert . Immer noch gut, aber bei weitem nicht so herausragend.
Mein Bauchgefühl ist, dass die Array-to-Hash-Methode any()
in den meisten Fällen besser abschneiden wird, aber ich würde mich viel besser fühlen, wenn ich solideere Metriken hätte (viele Testfälle, anständige statistische Analysen, vielleicht einige große). O algorithmische Analyse jeder Methode usw.) Abhängig von Ihren Anforderungen kann List :: MoreUtils eine bessere Lösung sein. Es ist sicherlich flexibler und erfordert weniger Codierung. Denken Sie daran, vorzeitige Optimierung ist eine Sünde ... :)