! Aktualisierte Ergebnisse >>Hier<< !
In den aktuellen Beta-Versionen von AutoIt (v3.3.13.16 Beta) findet sich ein neuer Datenstrukturtyp mitsamt zugehörigen Funktionen.
Der Datentyp nennt sich Map und ist in erster Linie ein assoziatives Array.
Also genau das was wir uns bisher über das Dictionary-Objekt extern reingeholt haben.
Aber nicht nur das - es ist weitaus flexibler. Für die Keys können Integer und/oder Strings verwendet werden. Nimmt man Strings ist das Verhalten wie ein Dictionary.
Nimmt man Integer - und vor allem in Verbindung mit der Funktion MapAppend() - dann hat man ein Array, das aber dynamisch. Das heißt das Hinzufügen von Elementen geht um Weiten schneller als ein _ArrayAdd.
Wenn man nun aber keine Key-Value-Struktur benötigt sondern einfach eine dynamische Stringliste (z.B. beim schrittweisen Erzeugen einer Dateiliste in einem Verzeichnis) dann kann man ebenfalls die Map benutzen.
Die Strings werden als Keys verwendet und ein Leerwert als Value. Anschließend holt man sich ein Array aus den Keys mit der Funktion MapKeys(). Das geht immer noch schneller als mit _ArrayAdd zu arbeiten. Alternativen hierzu wären die selbe Vorgehensweise mit dem Dictionary-Objekt oder ein String &= mit anschließendem StringSplit.
Das sind jetzt viele Anwendungsmöglichkeiten und auf so eine interne Struktur habe ich schon länger gewartet.
Also wollte ich jetzt mal herausfinden ob es denn von der Performance her gravierende Differenzen gibt, so dass ich Hinweise habe wann ich was am ehesten einsetzen kann.
Hierzu habe ich den Zeitbedarf beim Hinzufügen und Auslesen betrachten. Angefangen mit wenigen Elementen habe ich schrittweise die Anzahl der Elemente in der jeweiligen Struktur erhöht um zu sehen wie der Zeitbedarf mit der Elementanzahl korreliert. Hier sind die Ergebnisse für das Hinzufügen:
Dass die Variante einen String mit Trennzeichen zusammensetzen und am Ende per StringSplit in ein Array zu konvertieren die schnellste Variante werden wird habe ich erwartet. Umso mehr hat mich gefreut, dass die Map, in Verbindung mit MapAppend, da ganz gut mithalten kann. Die Keys werden dabei einfach durchnummeriert (wie beim Array) und wir haben damit also nun eine performante ArrayList direkt in AutoIt.
Es fällt auf, dass die Variante Dictionary-Elemente per .add-Methode hinzuzufügen (Beispiel: $oDic.add("Key", "Value")) langsamer ist, als die Variante per "="-Operator (Beispiel: $oDic("Key") = "Value"). Dies wird wahrscheinlich daran liegen, dass .add erst prüft ob das Element bereits existiert und einen Fehler wirft, während die =-Variante einfach bestehende Werte überschreibt. Ansonsten bewegen sich Map und Dictionary etwa auf dem selben Niveau. _ArrayAdd (=Array + ReDim) habe ich hier nicht mit reingenommen - dieses war schlicht zu langsam.
Zusammenfassend, kann man sagen. Will man eine Key-Value-Struktur aufbauen machen Map und Dictionary keinen großen Unterschied beim Hinzufügen von Werten. Möchte man einfache Arraystrukturen mit durchnummerieren Index erzeugen hat man nun mit MapAppend eine gute einfache Möglichkeit hinzugewonnen.
Das Aufbauen der Struktur ist aber erst ein Schuh. Der andere ist: Wie schnell bekomme ich die Daten da wieder raus.
Prinzipiell kann man erst einmal auch ohne Benchmark sagen: Bei einer einfachen durchnummerierten Liste, bei dem man ein bestimmtes Element von einer bestimmten Stelle haben möchte, ist ein Array schlicht das performanteste. Möchte man aber Werte suchen oder deren Existenz überprüfen sind Map und Dictionary die 1. Wahl. Und Key-Value Beziehungen sollten ja schon per Definition den Dictionaries und Maps vorbehalten sein.
Die Keys eines Dictionaries/Map kann man sich aber auch als Array zurückgeben. Dann hat man den schnellen Array-Zugriff auf die Keys in einer solchen Liste. Die Frage ist nur - wie groß ist dabei der Aufwand für das Umwandeln in ein Array?
Hierzu nun die Ergebnisse. Dargestellt ist der jeweilige Zeitbedarf für einen zufälligen Zugriff auf N Elemente.
Dictionary und Map nehmen sich nicht wirklich viel. Es bleibt wohl eher Geschmackssache was man verwendet.
Ebenso scheint der Zeitbedarf die Keys in ein Array zu wandeln nicht sehr groß zu sein im Vergleich zum eigentlichen Element-Zugriff.
Jetzt muss man natürlich dazu sagen, dass die Map noch Beta ist und sich noch viel ändern kann.
Aber als erste Einschätzung soll dies hier erst einmal genügen.