hoher CPU Verbrauch

  • Hallo,

    mir ist eben aufgefallen, dass AutoIt extrem viel CPU bei extrem kleinen Sachen verbraucht.

    Folgendes ist mir aufgefallen:

    [autoit]

    While 1
    WEnd

    [/autoit]


    Das verbraucht extrem viel CPU

    [autoit]

    While Sleep (10)
    WEnd

    [/autoit]


    Das dafür nicht. Soweit ich weiß setzt AutoIt doch automatisch Sleep(10) nach jedem Befehl oder nicht?

    [autoit]

    While Sleep (10)
    ProcessExists (@AutoItPID)
    WEnd

    [/autoit]


    Das verbraucht ebenfalls viel CPU

    [autoit]

    While Sleep (10)
    ;~ ProcessExists (@AutoItPID)
    WEnd

    [/autoit]


    Wie oben beschrieben, verbraucht dieser Fall sogut wie nichts.

    Ich brauche jedoch für mein Script ProcessExists ständig. Gibt es dafür eine Alternative oder Lösung für das Problem?

  • Die Funktion While prüft ob der Wert WAHR oder FAlSCH ist. Da Sleep garkein Rückgabewert hat ist das absolut Sinnlos dies in die While-Schleife als Vergleichswert zu setzen.

    Soweit ich weiß setzt AutoIt doch automatisch Sleep(10) nach jedem Befehl oder nicht?

    Nein tut es nicht.

    AutoIt versucht die Schleife so schnelle wie möglich auszuführen, daher die hohe Prozessauslastung. Daher musst du diese etwas Drosseln. Hiefür reich ein Sleep(10) vollkommen aus.

  • Musst du wirklich aller 10ms den Prozessstatus abfragen?
    Reicht nicht vielleicht auch 100ms? - dann würde das den Verbrauch weiter senken.
    Als Alternative zu deinem Konstrukt wäre ProcessWaitClose() zu nennen.

    Die Funktion While prüft ob der Wert WAHR oder FAlSCH ist. Da Sleep garkein Rückgabewert hat ist das absolut Sinnlos dies in die While-Schleife als Vergleichswert zu setzen.

    Sleep gibt 1 (=implizit True) zurück.
    Es kann daher, wie Freaky schrieb, als Kurzform für

    [autoit]

    While True
    Sleep(10)
    WEnd

    [/autoit]

    verwendet werden.

  • So extrem viel CPU "verbraucht" dieses Konstrukt bei mir aber nicht:

    [autoit]

    While Sleep (10)
    ProcessExists (@AutoItPID)
    WEnd

    [/autoit]

    Ob die CPU jetzt zu 100% ausgelastet ist oder nur zu 10% ist eigentlich wurscht, jedem Prozess wird eine gewisse Zeit die CPU zur Verfügung gestellt. Ist diese Zeit abgelaufen kommt der nächste Prozess dran. Mit Sleep() erreichst du nur dass die vorgesehene Zeit direkt abgebrochen wird und dein Prozess wieder warten muss, bis es den Zugriffsrecht auf die CPU erhält. Von daher musst du dir da keine sonderlich großen Gedanken drum machen.

  • also wenn ich hier in der Firma das hier verwende:

    [autoit]

    While 1
    Wend

    [/autoit]

    Dann dauerts nicht lang und mein Profil befindet sich in einem nicht beendbaren Loop - und das ist gaaaaaanz schlecht 8)

    "Hallo Admin, kannst du mein Profil resetten? Habe mal wieder einen Loop!" - "Du bist doch a Depp!" :thumbup:

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.

  • Was hab ihr denn für Firmenrechner ? Wenn ich das mache ist ein Kern ausgelastet. AutoIt-Prozess beenden und gut.
    Aber was hat mein Windows-Profil damit zu tun !? Wenn das jedesmal nen 'Knacks' bekommen würde, hätte ich schon seit Jahren Schwierigkeiten...

    Aber nun nicht zu weit vom Thema abschweifen....

    Zur Nutzung dieses Forum's, ist ein Übersetzer für folgende Begriffe unerlässlich:

    "On-Bort, weier, verscheiden, schädliges, Butten steyling, näckstet, Parr, Porblem, scripe, Kompletenz, harken, manuel zu extramieren, geckukt, würglich, excell, acces oder Compilevorgeng"

  • Thinclients, sau lahme Verbindung + Terminal Server mit Windows Server 2008 R2 Enterprise - noch Fragen?

    ...und ja, ein Loop zerballert mein Profil ;)

    Simon nörgelt, Simon nervt - aber Simon verbessert die Welt. Glaubt er.