au3 mehr auslasten für Dualcore zum Testen

  • Guten Tag, meine Herren

    Ich möchte demnächst ein Script schreiben und dachte, ich müsste das Script teilen und das meinem Dualcore zuteilen.
    Jetzt sehe ich, dass es ohnehin schon aufgeteilt wird.

    Ich habe das zum testen geschrieben

    [autoit]

    $i = 0
    While $i <= 100000000
    ;MsgBox(0, "Der Wert von $i lautet:", $i)
    $i = $i + 1
    WEnd

    [/autoit]

    und es sieht so aus

    [Blockierte Grafik: http://bigpichost.com/files/50p_sypi7_c2tbqll9.jpg]


    Was kann man in der au3 schreiben, so das die CPU Auslastung höher ist.

    Mich würde mal die Auslastung interessieren

    vielen Dank im Voraus

    Slider 8)

  • Mach mal 2 von den Skripten und weise jedes einem Core zu.
    Dann sinds 100% Auslastung ;)

    Das ist aber leider nicht das was ich bezwecken möchte. Mein späteres Script soll ja schnell sein und wenn ich jetzt 2 mal das Script für jeden Kern starte, würde ich jetzt nicht sehen, wie sich mein späteres Script verhalten würde.

    ich dachte, es würde jetzt jemand so etwas wie eine Rechenaufgabe Vorschlagen oder etwas anderes Rechenintensives.
    Hmm, muss mir mal was überlegen.

  • Hö? Du hast mit deinem Skript einen Kern 100% ausgelastet.

    ich verstehe deine Bemerkung nicht richtig, ich nehme an du siehst das Bild oben. Ich habe beide Kerne nur mit 50 % ausgelastet.
    Aber vielleicht kann man die beiden Kerne nicht mehr auslasten. Es würde wahrscheinlich einfach nur länger dauern !?

  • Hi,

    die Anzeige ist vollkommen korrekt. 100 % CPU bei Single sind 2 * 50 % bei DualCore / Hyperthreading. Bei QuadCore hättest du 4 * 25. Das heisst aber nicht, dass Dein Programm 2*, bzw 4* so schnell laufen wird.
    Hier siehst Du ebenfalls den Effekt, dass bei ungünstiger Programmierung Dein Rechner lahm gelegt wird. Füge mal in Deiner While Schleife ein Sleep (10) oder Sleep (20) ein. Die CPU Last wird rapide heruntergehen.

    ;-))
    Stefan

  • Hi,

    die Anzeige ist vollkommen korrekt. 100 % CPU bei Single sind 2 * 50 % bei DualCore / Hyperthreading.

    Ok, das müßte ich mal probieren.
    Auch bei einer ungünstigen Programmierung ( Die Cpu Auslastung ist am höchsten ) Dürfte bei einem Script nicht der Wert pro Kern über 50% liegen.
    Das würde wohl bedeuten, wenn ich eine Schleife initiiere und diese Zeit messe. sagen wir mal es dauert 40 Sekunden, dann würden bei 2 Scripten ( Die parallel laufen )die Gesammtzeit bei 80 Sekunden liegen.
    Ohne es jetzt getestet zu haben, müßte es theoretisch so sein.

  • Gib deinem Script die Priorität "Echtzeit" und du wirst sehen, was du davon hast^^
    Rechner starten, auf wissenschaftliche Darstellung wechseln, eine beliebige 15-stellige Zahl eingeben, auf Fakultät berechnen ( n! ) klicken und die Auslastung beobachten. Das aufpoppende Fenster musst du nicht beachten. Im Taskmanager die Priorität auf Echtzeit stellen und diesen Prozess dem Kern 1 zuordnen.
    Nochmal den Rechner starten , große Zahl Fakultät usw. , diesmal diesen Prozess dem Kern 2 zuteilen.
    Wenn du danach noch deinen Rechner einigermassen flüssig bedienen kannst, hast du was falsch gemacht!

  • Gib deinem Script die Priorität "Echtzeit" und du wirst sehen, was du davon hast^^

    Ich habe es jetzt mal ausprobiert. Die erste Schleife habe ich gemessen und dann die zweite Schleife hinzugefügt. Ich konnte beobachten, dass die beiden Kerne zu 100% ausgelastet sind.
    Und die zwei parallel laufenden Schleifen hatten ungefähr die Zeit einer Schleife.

    Das ist wohl der Beweis, dass autoit doch Multithread fähig ist.

    [autoit]

    Run("schleife2.exe")
    $begin = TimerInit()
    $i = 0
    While $i <= 5000000

    $i = $i + 1
    WEnd

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

    $dif = TimerDiff($begin)
    MsgBox(0,"Die Zeit von Script 1",$dif)

    [/autoit]

    Edit

    Gib deinem Script die Priorität "Echtzeit" und du wirst sehen, was du davon hast^^

    Vielen dank für deinen langen Text. Ich hatte schon mal eine Antwort geschrieben aber durch "Strg" und einer anderen Taste hatte ich das Fenster geschlossen.
    Und mußte neu schreiben
    zu Deiner Antwort kann ich sagen, dass es so ausführlich ist, dass ich es auch nicht probieren brauche. Wenn ich die Lust dazu habe, werde ich es mal demnächst testen.

    Einmal editiert, zuletzt von Slider99 (19. November 2009 um 15:36)

  • Nee das ist der Beweis, dass es Sinn machen kann eine aufwendige Funktion in ein zweites Skript auszulagern.

    Das dürfte wohl jetzt Off-Topic sein, aber kann mir bitte jemand in kurzen Worten erklären, wie ich zwei Scripte miteinander kommunizieren lassen kann. ich dachte so an - Wert in *.ini schreiben und vom 2. Script auslesen lassen. Aber das dürfte wohl zu lange dauern.
    Bin über eine Antwort dankbar.

  • Zitat

    Das dürfte wohl jetzt Off-Topic sein, aber kann mir bitte jemand in kurzen Worten erklären, wie ich zwei Scripte miteinander kommunizieren lassen kann. ich dachte so an - Wert in *.ini schreiben und vom 2. Script auslesen lassen. Aber das dürfte wohl zu lange dauern.
    Bin über eine Antwort dankbar.

    Hi, dafür gibt es auch eine UDF. Ich glaube sie heißt MessageHandler. Schau einfach mal im Englischen forum nach ;)

  • Bsp.: (Skripte natürlich noch trennen)

    Spoiler anzeigen
    [autoit]


    ;Script2 -> Sender
    #include "MessageHandler.au3"

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

    $Local_ReceiverID_Name = "Script2sReceiverID";This is the ID that the other script will use to send data
    $Remote_ReceiverID_Name = "Script1sReceiverID";This is the ID of the script we want to send data too

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

    $hwnd = _SetAsReceiver($Local_ReceiverID_Name)
    ConsoleWrite("hwnd of the Local_ReceiverID_Name is " & $hwnd & @crlf)
    $myFunc = _SetReceiverFunction("_MyFunc2")
    ConsoleWrite("My data receiver function is " & $myFunc & @crlf)

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

    $Str = InputBox(@ScriptName," I am " & @ScriptName & @crlf & "Enter some data to be sent to the other script")

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

    $iSent = _SendData($Str,$Remote_ReceiverID_Name)

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

    While 1
    sleep(100)
    WEnd

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

    Func _MyFunc2($vText)
    Msgbox(0,@ScriptName,@ScriptName & " has received a message" & @crlf & $vText)
    Exit
    EndFunc

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

    ;Script1 -> Empfänger
    #include "MessageHandler.au3"

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

    $Local_ReceiverID_Name = "Script1sReceiverID";This is the ID that the other script will use to send data
    $Remote_ReceiverID_Name = "Script2sReceiverID";This is the ID of the script we want to send data too

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

    $hwnd = _SetAsReceiver($Local_ReceiverID_Name)
    ConsoleWrite("hwnd of the Local_ReceiverID_Name is " & $hwnd & @crlf)
    $myFunc = _SetReceiverFunction("_MyFunc2")
    ConsoleWrite("My data receiver function is " & $myFunc & @crlf)

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

    While 1
    Sleep(1000)
    WEnd

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

    Func _MyFunc2($vText)
    Msgbox(0,@ScriptName,"I am " & @ScriptName & " I have received some data" & @crlf & @crlf & $vText & @crlf & @crlf & "And now I'm sending the data back")
    $iSent = _SendData($vText,$Remote_ReceiverID_Name)
    Exit
    EndFunc

    [/autoit]
  • Hi, dafür gibt es auch eine UDF. Ich glaube sie heißt MessageHandler. Schau einfach mal im Englischen forum nach ;)

    Ja, vielen Dank, ich hoffe nur, dass ich niemanden sagen muss, wie mein English ist ^^


    Hallo,

    es gibt im Englischen Forum eine "CoProc.au3" UDF. Versuchs doch mal damit. Ich glaube das ist genau das was Du suchst. Aber es ist kein Multithreading. Es führt nur eine Funktion in einen anderen Prozess aus ;).

    Danke, das werde ich mir mal ansehen :P

    EDIT
    Und Danke an Nuts,

    ich werde mir die Sache mal ansehen und bei bedarf das Thema wohl auslagern, es gibt bestimmt auch andere, die das interessieren könnte ^^

    Einmal editiert, zuletzt von Slider99 (19. November 2009 um 16:00)