Optimierung meines Skriptes

  • Hallo zusammen,

    wer hilft mir Neuling :-), diesen Anfang meines Skriptes, welcher auf unseren Notebooks zur Kennwortsynchronisation dauerhaft ab Rechnerstart laufen soll, weiter zu verschlanken bzw. die Arbeitsspeicherlast zu reduzieren?

    [autoit]

    While 1
    $List = ''
    $wl = WinList("[class:tooltips_class32]");get all th etooltips
    For $n = 1 To $wl[0][0]
    If BitAND(WinGetState($wl[$n][1]), 2) Then;if visible
    $List &= WinGetTitle($wl[$n][1]); read the title, which for a tooltip is the text
    EndIf
    _ReduceMemory()
    Next

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

    If $List = "Sperren Sie den Computer und heben Sie anschließend die Sperrung unter Verwendung Ihres aktuellen Kennworts oder Ihrer Smartcard auf. Klicken Sie auf das Symbol, um weitere Informationen zu erhalten." Then
    ExitLoop

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

    EndIf
    sleep(1000)
    _ReduceMemory()
    WEnd

    [/autoit]


    Funktion:

    [autoit]

    Func _ReduceMemory($i_PID = -1)
    Local $ai_Return
    If $i_PID <> -1 Then
    Local $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $i_PID)
    $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', $ai_Handle[0])
    DllCall('kernel32.dll', 'int', 'CloseHandle', 'int', $ai_Handle[0])
    Else
    $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'long', -1)
    EndIf
    Return $ai_Return[0]
    EndFunc ;==>_ReduceMemory

    [/autoit]

    (aus autoit.de)

  • Zur Optimierung eig. nichts direktes, aber um den Rechner nicht unnötig zu belasten würde ich nicht While 1 benutzen sondern Whole Sleep (30) oder so, das verringert die Belastung sehr.

    mfg BB

    "IF YOU'RE GOING TO KILL IT
    OPEN SOURCE IT!"

    by Phillip Torrone

    Zitat von Shoutbox

    [Heute, 11:16] Andy: ....böseböseböseböse....da erinnere ich mich daran, dass man den Puschelschwanz eines KaRnickels auch "Blume" nennt....ob da eins zum anderen passt? :rofl: :rofl: :rofl: :rofl:

    https://autoit.de/index.php?page…leIt#post251138

    Neon Snake

  • Wenn ich das richtig verstehe wartest du auf ein Fenster der Klasse tooltips_class32 und diesem unsäglich langem Titel?
    Weil ich verstehe nicht ganz warum du $List &= schreibst.
    Das würde bei mehreren gefundenen Fenstern alle Titel zusammenhauen - ist das bewusst so gewollt - wenn ja: Warum?
    Wenn es stattdess wirklich nur um 1 Fenster mit diesem Titel geht würde ich stattdessen so herangehen:

    Spoiler anzeigen
    [autoit]

    Global Const $s_Title = "Sperren Sie den Computer und heben Sie anschließend die Sperrung unter Verwendung Ihres aktuellen Kennworts oder Ihrer Smartcard auf"
    Global Const $s_Class = "tooltips_class32"
    Global $a_WinList

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

    Global Const $h_PsAPI = DllOpen("psapi.dll")

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

    While Sleep(100)
    $a_WinList = WinList("[TITLE:" & $s_Title & "; CLASS:" & $s_Class & "]")
    For $i = 1 To $a_WinList[0][0]
    Sleep(50)
    If BitAND(WinGetState($a_WinList[$i][1]), 2) Then ExitLoop
    Next
    DllCall($h_PsAPI, 'int', 'EmptyWorkingSet', 'long', -1)
    WEnd

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

    DllClose($h_PsAPI)

    [/autoit]


    Damit steigt bei mir die Prozessorlast nie auf über 0,2%.
    Inwiefern du beim Arbeitsspeicher um jedes kilobyte kämpfen musst weiß ich nicht aber 8mb für eine Interpretersprache halte ich schon für ok.
    Überhaupt sind deine Auslastungsspitzen der ReduceMemory-Funktion zuzuschreiben.
    Vor allem da du dort jedesmal die DLL neu öffnest und wieder schließt anstatt das Handle offen zu halten (z.B. indem man statische Variablen verwendet).

    Edit: Hab dir dennoch mal die EmptyWorkingSet-Funktion mit eingebaut - aber so das sie keine Spitzen erzeugt.

    2 Mal editiert, zuletzt von AspirinJunkie (17. Februar 2012 um 21:38)

  • Vielen, vielen Dank. Ich muss da nicht kämpfen. Da es nur ein Programm ist, welches auf allen Notebooks bei uns laufen soll, möchte ich es natürlich so stark optimieren, wie nur möglich.

    Das ist ja ein Unterschied wie Tag und Nacht? Ist es schonender, so viele Dinge wie möglich im Vorfeld festzulegen (vgl. Konstanten)?

    Was mich aber interessieren würde: wie stehst Du / steht ihr zu der ReducyMemory-Funktion, welche ich hier im Forum aufgeschnappt habe?

    Ist sie eher kontraproduktiv?

    Ein ähnliches Programm (nur zu einem anderen Zweck) soll auf unserem Terminalserver eingesetzt werden. Dort will ich natürlich so wenig Wind wie möglich verursachen ;) Was könntest Du da empfehlen?

    P.S.: Sorry wegen der Kerne - ich hatte die Prozessoren im Kopf :D

    2 Mal editiert, zuletzt von AutoITier (18. Februar 2012 um 11:54)

  • P.S.: Sorry wegen der Kerne - ich hatte die Prozessoren im Kopf :D

    Ich habe da so eine abenteuerliche Theorie: Bei mir kann ein AutoItscript maximal 25 Pozent Prozessorlast verursachen. Ich habe 4 Kerne. AutoIt unterstützt ja nur einen Kern (mir ist der Fachbegriff grade entfallen) und 100 (höchstmögliche Summe der prozentualen Auslastung aller Kerne) / 4 (Anzahl der Kerne) = 25 (Maximale Last auf einem Kern).
    Mit 2 AutoIt Programmen steigt die Prozessorlast auf maximal 50%, mit 3 auf 75% und mit 4 auf max. 100%

    Als du jetzt schriebst, die Prozessorlast steigt bei dir (kurzzeitig) auf 25 Prozent, wollte ich die Anzahl der Kerne wissen, um meine Theorie zu überprüfen (wenn meine Theorie stimmt und du 4 Kerne hast, würde das bedeuten, dein Script braucht die für ein AutoItscript maximal verfügbare Rechenkraft des Prozessors).

    Jetzt aber genug Off Topic.

  • Ist es schonender, so viele Dinge wie möglich im Vorfeld festzulegen (vgl. Konstanten)?

    Wenn man damit Mehrfachzuweisungen verhindert - ja.
    In erster Linie dient es aber eher der Übersicht und das man die zentralen Parameter des Skriptes alle an einer Stelle bearbeiten kann.

    wie stehst Du / steht ihr zu der ReducyMemory-Funktion

    Soweit mir bekannt werden damit lediglich Daten vom RAM in die Auslagerungsdatei verschoben.
    Das dürfte keinen positiven Effekt auf die Performance haben sollte aber bei derartigen Skripten wo keine Performance benötigt wird egal sein.
    Problematischer finde ich eher das damit die Festplatte im Dauerbetrieb gehalten wird. Gerade bei Skripten welche permanent laufen würde dies dazu führen das diese sich auch in Ruhezeiten nicht abschalten kann.
    Wenn man nicht wirklich gerade riesige Probleme mit zu wenig RAM bekommt dann würde ich persönlich von einem Gebrauch dieser Funktion abraten.