AutoIt Array Speicherfresser?????

  • Ich finde es ungünstig, dass es nur die zwei Gültigkeitsbereiche gibt, da man manchmal Variablen nur zeitweise braucht, z.B. nur innerhalb einer Schleife, und dass man auch innerhalb von Funktionen oder neue globale Variablen erzeugen kann.
    Letzteres ist eine zusätzliche Fehlerquelle, da es sein kann, dass Variablen unter bestimmten Bedingungen nicht existieren, unter anderen aber schon.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    If $test>=5 Then
    ; ...
    Global $Variable = 22
    ; ...
    Else
    ; ...
    EndIf

    [/autoit] [autoit][/autoit] [autoit]

    MsgBox(0, "", $Variable)

    [/autoit]

    Je nachdem, welchen Wert die Variable $test hat, reagiert das Skript anders. Die globale Variable wird aber nur bei Werten größer oder gleich 5 definiert. Andernfalls bricht das Programm mit einer Fehlermeldung ab. Es kann vorkommen, dass meistens der Wert von $test über 5 ist und nur in seltenen Situationen darunter. Dann hat man einen Fehler, der schwer reproduzierbar ist und bei Test auch kaum gefunden wird. Wäre man gezwungen, die Variablen vor der Abfrage zu deklarieren, würde dieses Problem nicht bestehen.

    Es ist vernünftig und wird meistens so gemacht, denn wenn man an einen String nur ein Zeichen anhängt, müsste sonst neuer Speicher alloziiert, der alle Zeichen kopiert, das Zeichen angehängt und dann der alte Speicher freigegeben werden. So verhindert man, dass die ganze Arbeit zu oft gemacht werden muss.
    Irgendwo kann man noch Ausschnitte aus dem Programmcode älterer AutoIt-Versionen herunterladen (RegEx, DllCall, GUI-Funktionen wurden herausgenommen). Das hab ich mir mal kurz angeguckt und gesehen, dass AutoIt bei Strings immer auf 8 Byte aufrundet.

    • Offizieller Beitrag

    Ich finde es ungünstig, dass es nur die zwei Gültigkeitsbereiche gibt, da man manchmal Variablen nur zeitweise braucht, z.B. nur innerhalb einer Schleife, und dass man auch innerhalb von Funktionen oder neue globale Variablen erzeugen kann.


    Das sehe ich genauso. Ich denke es wäre sicher kein allzu grosser Aufwand, "Do-End" in AutoIt zu integrieren. Innerhalb einer solchen Struktur erstellte Variablen wären auch nur dort gültig und würden anschließend sofort verworfen. Auch sollten Zählervariablen von Schleifen am Ende der Schleife automatisch aus dem Speicher entfernt werden - leider bleiben sie in AutoIt erhalten.
    Ich arbeite recht viel mit LUA, da ist das perfekt umgesetzt und es gilt der eiserene Grundsatz: Vermeide Globale Variablen, denn damit wird das Skript langsam.
    Leider kann man in AutoIt den Globalen Variablen kaum aus dem Weg gehen, aber man kann durch Auslagern in Funktionen und Übergabe von Variablen, den Bedarf an Globalen Variablen minimieren.

  • Hi BugFix

    Ab ca. wievielen Globalen Variablen kann man sagen dass es die Scriptgeschwindigkeit beeinflusst?

    mfg

    • Offizieller Beitrag

    @D2thunder: Das kann ich dir in Bezug auf AutoIt nicht sagen, da ich nur sicher weiss, dass in LUA Skripte durch Globale Variablen verlangsamt werden. AutoIt mit seinem seltsamen Variablen-Scope geht eh eigene Wege. Da AutoIt aber sowieso mindestens Faktor 10 langsamer ist als LUA spielt das sicher eher eine untergeordnete Rolle. Geh doch einfach immer so vor: Kannst du Globale Variablen vermeiden - dann vermeide sie. Ist natürlich unbefriedigend, dass man für den Bereich eines Skriptes (also Lokal innerhalb des Skriptes) Globale Variablen verwenden muss um sie allen Teilen des Skriptes zugänglich machen zu können.
    Aber du kannst eigentlich unbesorgt sein. Im Allgemeinen wirst du kaum Probleme dadurch haben.

  • Gemäß des Quellcodes verwendet(e) AutoIt einen einfachen ungeordneten Suchbaum für die Variablen und sortiert sie nach Namen.
    Sie sind im schlimmsten Fall alle als Kette angeordnet sortiert.

    LUA verwendet ein komplett anderes System. Die Variablen werden als Listen (mit Erweiterung) abgespeichert. Die Suchzeit ist immer so, wie es bei AutoIt im schlimmsten Fall ist. Dafür gibt es in LUA Tabellen. Anstatt viele globalen Variablen, sollte man einige globale Tabellen erstellen und darin Variablen und Funktionen speichern.

    Lokale Variablen werden in LUA übrigends ohne Name gespeichert, sind also nur Werte im Stack (http://lua-users.org/wiki/ScopeTutorial).