_DynArray-UDF - halbdynamische Arrays mit AutoIt

  • Die Ansätze von >>hier<< habe ich mal zu einer ausgewachsenen UDF ausgebaut (Siehe Anhang).
    Worum geht es?: Arrays sind verdammt fix beim direkten Zugriff auf einzelne ihrer Elemente. Sobald aber Werte hinzugefügt oder gelöscht werden sollen sind diese Vorgänge (über ReDim) unglaublich träge.
    Je größer die Arrays werden umso schlimmer wird das dann. Arrays eignen sich daher für eine Vielzahl an Anwendungsfällen nicht.
    Ein gebräuchlicher Lösungsansatz ist jedoch nur Zweierpotenzen als Arraygröße zuzulassen. Das verschafft Luft für neue Elemente und Arrays können von nun an auch dynamisch verwendet werden. Nun kann man ein Array auch sinnvoll wie ein Stack oder eine Queue verwenden.

    Auf dieser Idee aufbauend habe ich eine UDF erstellt welche die Nutzung dieses Prinzips für 1D-Arrays genauso einfach machen soll wie die bisherigen _Array-Funktionen in AutoIt und im Grunde als ihr Ersatz dienen soll.
    Als zusätzliches Schmankerl habe ich dann noch die von Python bekannten Map-, Reduce- und Filter-Funktionen für AutoIt umgesetzt.

    Die UDF enthält somit folgende Funktionen:

    Um die Möglichkeiten der UDF zu demonstrieren gehen wir mal anhand von Beispielen durch:


    Wer mal wissen möchte, was das ganze für einen Unterschied beim dynamischen Hinzufügen von Werten macht kann folgendes kleines Testskript ausführen:

    Bei mir war _DynArrayPush dabei um den Faktor 20 schneller. Dieser Vorteil steigt weiter mit der Elementanzahl.

    Changelog:

    2020/06/16
    • __ArrayDualPivotQuicksort (und alle die diese verwenden wie z.B. _ArraySortFlexible): Fehlerhafte Bestimmung der beiden Pivotelemente - führte entweder zu langsamer Sortierung oder zu Abstürzen
    • unbenutzte aber deklarierte Variablen entfernt.
  • Danke dir fürs Feedback.
    Der Performance-Unterschied hängt direkt von der Anzahl der Elemente ab.
    Wenn du weniger Elemente hast, ist der Unterschied geringer.
    Wenn mehr Elemente hinzugefügt werden ist der Unterschied größer.

  • Sollte gepinnt werden! :thumbup:
    Wieso kommen die AutoIt-DEV´s nicht auf so etwas?!
    DAS wäre mal ein Grund, auf eine der neuen Versionen upzudaten.

    Ich werde mal prüfen, inwieweit man diese Funktionen komplett in die bereits bestehenden _ArrayXXXXX()-Funktionen transferieren kann!

  • Zitat

    Die AutoIt devs sind darauf gekommen Schau dir mal die neuste Beta an. Da gibt es Maps..

    jo, statt die Funktionen, die 90% aller User täglich benotigen zu verbessern, wird etwas hinzugefügt, was maximal 1% der User vermissen....
    Man könnte fast meinen, die würden für M$ arbeiten ;(
    Dort wurde mir telefonisch von einem Entwickler mitgeteilt, als ich div. Excel-Bugs "gefixt" haben wollte:" Aber Herr XXXX, wir verdienen Milliarden mit diesem Produkt, würden Sie daran etwas ändern?!"
    Das war vor ca. 15 Jahren, und daran hat sich bis heute nichts geändert!
    Wenigstens habe ich seitdem verstanden, nach welchen Prämissen heutzutage programmiert wird! :D

  • Hi

    Ich hab die UDF gefunden, das ist einfach super denn sie hilft mir bei meinem aktuellen AutoIT-Projekt sehr :)

    Ich hab mal die Beispiele ausprobiert, dabei ist mir aufgefallen dass "2D-Array mit komplexer Sortiervorschrift" nicht funktioniert (AutoIT 3.3.14.2). Ich bekomme nach der ersten Arrayanzeige:

    Code
    ...
    "C:\Users\thomy\Desktop\DynArray\DynArray.au3" (596) : ==> Array variable has incorrect number of subscripts or subscript dimension range exceeded.:
    $t1 = $a[$aMp[$i]]
    $t1 = ^ ERROR

    Woran kann das denn liegen?


    Gruß Thomy

  • Hab die UDF neu heruntergeladen sowie die aktuelle AutoIt-Version.
    Habe dann das Beispiel unverändert ausgeführt.
    Die Fehlermeldung kann ich bei mir dabei nicht reproduzieren.
    Egal ob als x86 oder x64.

    Kann jemand anderes den Fehler eventuell reproduzieren?

    Mich wundert jedenfalls die Zeilennummer 596, denn die fragliche Zeile befindet sich in der UDF nämlich in der Zeile 615.

  • Hey @AspirinJunkie,
    in der aktuellen UDF-Version kann ich das Problem auch nicht nachvollziehen. Alles gut. Ich habe das "2D-Array mit komplexer Sortiervorschrift" Beispiel mit der Version getestet, die ich Juni 2015 geladen habe. Damit bricht das Beispiel mit Fehler ab (da ist es auch in Zeile 596).

    Grüße autoiter

  • Hi

    Habe gerade getestet mit AutoIT 3.3.14.2


    Ich hatte aber anscheinend eine alte Version der UDF (77kb Größe), mit der aktuellen (102kb) funktioniert es. Gibts irgendwo ein Changelog? :)

  • Da ich die Verbreitung der UDF nicht wirklich kenne und diese eigentlich primär für mich pflege hab ich bisher immer silent updates gemacht.
    Ich gelobe für die Zukunft Besserung und schreibe Änderungen von nun an hier rein.