• Hallo zusammen,
    in letzter Zeit gab es einige sehr interessante Threads zum Thema Geschwindigkeitsoptimierung und Verbesserung der Laufzeit von AutoIt-Scripten. Einiges ist schon länger bekannt (Funktion X ist schneller als Funktion Y , bspw Select/IF/Switch) allerdings besteht immer das Problem, den schön lesbaren Scriptcode mit "unleserlichen" Optimierungen zu verschlimmbessern. Schon bestehende externe Funktionen müssten umgeschrieben werden usw...

    Daher schlage ich eine Art "Precompliler" für den µIt vor!
    Aufgabe:
    Erstelle ein Script, welches vor dem Kompilieren eines Programms (einzubinden in den "Kompiler" ggf. auch bei Run before/after) den Programmcode (incl der Includes?!) untersucht und optimiert. Art und Weise der Optimierung ist euch überlassen :D Der ursprüngliche Scourcecode soll erhalten bleiben (Sicherungskopie), idealerweise werden die Änderungen dokumentiert (Logfile)

    Bewertet werden Effizienz und Ausführungsgeschwindigkeit sowohl des Scripts, als auch des zu optimierenden Programms.
    Sicherlich ist jedem klar, daß keine Wunder zu erwarten sind, aber einige Überraschungen werden sich bestimmt ergeben!
    Interesse?

    /*EDIT*/ Linksammlung zum Thema Optimierungen: (erweitern bitte^^)
    http://www.autoitscript.com/forum/index.php?showtopic=51604&view=findpost&p=390213

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    3 Mal editiert, zuletzt von Andy (13. November 2009 um 16:00)

  • Wow heftige idee. das wäre auf jeden fall mal was sehr nützliches, da ich mir oft überlegt ob ich funktionen auf geschwindigkeit optimieren sollte oder doch lieber die Lesbarkeit beibehalten. so wäre das problem ideal gelöst.

    ich werds auf jeden fall versuchen.

    ideal wäre dann aber noch eine liste mit bekannten geschwindigkeitsoptimierungen. damit jeder die gleichen vorraussetzungen hat.
    ich kenn zum beispiel nur die:
    - kurze variablennamen schneller als lange
    - select case schneller als if

  • Stellt sich nur die Frage wie man das am besten Bewerten soll.
    Für ein vorgefertigtes Testskript lässt sich sicherlich schnell eine gute Optimierung finden.
    Bei zufälligen Testskripten kann die Bewertung je nach Vorgehensweise auch extrem schwanken.

    Lesbar/unlesbar ist imho eher eine Frage des Know-how. Sobald man die Vorgehensweise der Optimierung verstanden hat, versteht man auch den Code.

  • Ich hab jetzt mal etwas herumprobiert und muß sagen, daß diese Aufgabe ziemlich heftig ist!

    Wenn man nur die Global Const durch ihre Werte ersetzen will oder die Namen der Funktionen kürzen, dann muß man bereits unzählige Möglichkeiten berücksichtigen!

    Folgendes Script zeigt ein paar dieser Probleme:

    Spoiler anzeigen
    [autoit]

    #include "Winapi.au3"
    ;#include 'Winapi.au3'
    ;#include <Winapi.au3>
    $Test = '#include "Winapi.au3"'
    $Test = "#include 'Winapi.au3'"
    Global Const $Const1 = 0x01
    Global Const $Const2 = $Const1 + 0x01
    Global Const $Const3 = (0x01 + 0x02), $Const4 = "0x04" & '0x40'
    Global Const $Const5[2][2] = [[0x05, 0x05],[0x05, 0x05]], $Const6[2][2] = [["Global Const $Const1 = 0x01", $Const1],[$Const1, BitOR(BitAND(1, 2), 3)]], $Const8 = BitOR(0, 1, 2)
    Global Const $Const7 = "Global Const $Const1 = 0x01"
    Global Const $Const1Neu = "Run('Notepad.exe')"
    Global Const $Const9 = 0x01, _
    $Const10 = 0x02

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

    ConsoleWrite($Const1 & @LF)
    ConsoleWrite($Const2 & @LF)
    ConsoleWrite($Const4 & @LF)
    ConsoleWrite($Const6[0][0] & @LF)
    ConsoleWrite($Const7 & @LF)
    ConsoleWrite($Const1Neu & @LF)
    ConsoleWrite(Eval("Const3") & @LF)

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

    ConsoleWrite(Eval("Con" & "st3") & @LF)

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

    $Test="3"
    ConsoleWrite(Eval("Const" & $Test) & @LF)

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

    ConsoleWrite(Execute("$Const5[0][0]") & @LF)
    ConsoleWrite("Vorher " & _
    " Nachher")

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

    Opt("GuiOnEventMode", 1)

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

    $hGui = GUICreate("")
    GUISetOnEvent(-3, "_EXIT")
    For $i = 1 To 3
    GUICtrlCreateButton($i, 10, $i * 30, 100, 20)
    GUICtrlSetOnEvent(-1, "_Func" & $i)
    Next
    GUISetState()

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

    Call("_Function1")

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

    Call("_Fun" & "cti" & "on1")

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

    $Test="1"
    Call("_Function" & $Test)

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

    For $i = 1 To 3
    Call("_Func" & $i)
    Next

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _Func1()
    ConsoleWrite("Func1" & @LF)
    EndFunc

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

    Func _Func2()
    ConsoleWrite("Func2" & @LF)
    EndFunc

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

    Func _Func3()
    ConsoleWrite("Func3" & @LF)
    EndFunc

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

    Func _Function1()
    ConsoleWrite("Function1" & @LF)
    _Function2()
    EndFunc

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

    Func _Function2()
    ConsoleWrite("Function2" & @LF)
    _Function3()
    EndFunc

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

    Func _Function3()
    ConsoleWrite("Function3" & @LF)
    EndFunc

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

    Func _Exit()
    Exit
    EndFunc

    [/autoit]

    Sollte dieser µIt tatsächlich zustandekommen, dann wird 1 Monat wohl nicht ausreichen ;)

    mfgE

  • Klingt interessant aber ich werde leider kaum Zeit dafür haben. :/

    Ich glaube aber das mir eine optimierung noch eingefallen ist, und zwar:
    Wenn es keine Rolle spielt in welcher Reihenfolge das Array ausgelesen werden muss so ist so eine Schleife schneller:

    [autoit]

    For $i = Ubound($array)-1 To 0 Step $i -= 1
    ;bla
    Next

    [/autoit]

    Als so eine Schleife

    [autoit]

    For $i = 0 To Ubound($array)-1
    ;bla
    Next

    [/autoit]

    Da in der 2. Schleife jedesmal der Ubound-Wert + eine Subtraktion gemacht werden muss um $i zu überprüfen oder? Desweiteren ist es normalerweise einfacher einen Wert auf 0 zu überprüfen.
    Ich hoffe das ist in AutoIt auch alles so :P
    Es wird wahrscheinlich nur extrem schwer sein das zu automatisieren. Aber für irgendwas muss ein Programmierer ja auch noch da sein :P

    MFG FireFlyer

    *Paradox ist, wenn man sich im Handumdrehen den Fuss bricht* :D

  • Sowas kannst du nicht wirklich umsetzen denke ich. Mit Replace Select for Switch ist die Sache ja nicht erledigt.
    Wenn ich mit au3 was mache dann benutze ich z.B. CreateThread.. und sowas lässt sich da nicht einfach reinkompilieren.

  • naja das riecht ja eher nach Parser bzw. Präprozessor was du machen möchtest. Ich sag mal, erst mal die ganzen Möglichkeiten via BNF notieren und dann kann man sich das schon schreiben.

  • Hallo ich bin zwar noch nicht so lange dabei aber was von wegen geschwindigkeits optimierung hab ich hier noch nie gelesen. Leider hab ich zu wenig kentnisse um hier mitzuarbeiten. Dennoch möchte ich ohne die absicht dieses Thema vollzumüllen mal Fragen ob jemand zu einem derartigen post verlinken oder dasmal zusammenfassen kann. :|

  • Zitat

    ob jemand zu einem derartigen post verlinken oder dasmal zusammenfassen kann.

    Siehe Link im 1. Post und Stilgars Umsetzung hier