Seite 1 von 2

CPU-Auslastung 95% :-)

Verfasst: 07.06.2005 15:12
von Delle
Mein simples Programm nimmt 95% der CPU in Anspruch ;)

Wie kann man das beseitigen? Mit Delay in der Hauptschleife?

Wenn ja, welcher Wert ist da angemessen OHNE das das Programm ruckelt etc.?

Verfasst: 07.06.2005 15:16
von DrShrek
ja, und Delay(1) ist ausreichend.
Probiers halt mal aus...

Verfasst: 07.06.2005 15:50
von Lukas-P
jenachdem was das fürne Anwendung ist. Wenn das eine Anwenung in einem Fenster ist würde ich kein delay(1) nehmen denn das würde laggen dann solltest du doch lieber delay(10) nehmen. Oder einfach ausprobieren :allright:

Verfasst: 07.06.2005 15:52
von MVXA
Wenn du in einer For:Next schleife arbeitest, könnte ich dir noch einen Trick empfehlen:

Code: Alles auswählen

For lngI = 1 to 1000
    ; Code hier
    if (lngI%10) = 0 
       delay(1)
    endif
Next
klaut nicht die gesamte CPU und die For Schleife wird trozdem akzeptabel schnell ausgeführt. Die 10 kannst du natürlich auch durch einen anderen Wert ersetzen.

Verfasst: 07.06.2005 16:54
von NicTheQuick
Welche Schleife ist es denn?

Auf deine Frage gibt es keine allgemeine Lösung.

@MVXA:
Damit nicht ständig der Modulo ausgerechnet werden muss:

Code: Alles auswählen

Forr lngI = 1 to 1000
    ; Code hier
    If lngI & %111 = 0
       Delay(1)
    EndIf
Next
Das geht dann natürlich nur in 2-er-Potenzen-Schritten. :|

Verfasst: 07.06.2005 17:01
von Delle
Die ganz normale Schleife Repeat / Until...

Verfasst: 07.06.2005 17:13
von bluejoke
Achja, Lukas-P:
Delay(10) verzögert die Ausführung der weiteren Befehle um die zehnfache Zeit von Delay(1) - genauer gesagt um 10, statt 1 Millisekunde. Laggt daher deutlich mehr.

IMHO spielt es aber keine großartige Rolle, ob man nun Delay(10) oder Delay(1) hernimmt, das beste wäre sowieso WaitWindowEvent() statt WindowEvent() - wenns um ein Fenster geht.

Simon

Verfasst: 07.06.2005 20:06
von MVXA
@NIC
und den optimierungs sieg hat MVXA gewonnen <_<.

Folgender Code wurde getestet:

Code: Alles auswählen

lngtime = ElapsedMilliseconds()
For lngI = 1 To 1000
    ; Code hier
    If lngI & %111 = 0
        Delay(1)
    EndIf
Next
Debug "NIC: " + Str(ElapsedMilliseconds()-lngtime)

lngtime = ElapsedMilliseconds()
For lngI = 1 To 1000
    ; Code hier
    If (lngI%10) = 0
        Delay(1)
    EndIf
Next
Debug "MVXA: " + Str(ElapsedMilliseconds()-lngtime)
Das Ergebniss sieht so aus:
Der Debugger hat geschrieben:NIC: 1954
MVXA: 1562
Ich weiss, dass ich ein Held bin ~_~... Rund 400 ms schneller <_<

Verfasst: 07.06.2005 20:14
von NicTheQuick
@MVXA: :lol: Wie willst du denn die beiden Codes anständig vergleichen?
Bei meinem Code wird das [c]Delay(1)[/c] z.B. immer alle 8 Durchläufe aufgerufen, bei dir nur alle 10 Durchläufe. Da musst du schon dein Modulo auch auf 8 setzen. <)

Außerdem macht man Geschwindigkeitstest nicht mit dem Debugger. Wer hat dich den geritten? :|

Ich hab mal einen neuen Test aufgesetzt und festgestellt, dass keiner von beiden schneller ist. Im Durchschnitt sind sie genau gleich. Das liegt unter anderem daran, dass [c]Delay(1)[/c] nie genau 1 ms ist.

Verfasst: 07.06.2005 20:26
von traumatic
MVXA, klar bist Du der Held, das weiß doch jeder. ;)

Dennoch behaupte ich mal, NTQs Lösung ist generell die schnellere
- trotz Deines anschaulichen Tests:

Code: Alles auswählen

OpenConsole()

lngtime = ElapsedMilliseconds()
For lngI = 1 To $FFFFFFF
  res.l = lngI & %111
Next
PrintN("NIC: " + Str(ElapsedMilliseconds()-lngtime))

lngtime = ElapsedMilliseconds()
For lngI = 1 To $FFFFFFF
  res.l = lngI%10
Next
PrintN("MVXA: " + Str(ElapsedMilliseconds()-lngtime))
Input()
BTW: Bitte nie "Performance-Tests" mit Debugger machen! :)
Im übrigen sind solche "Tests" ohnehin fern jeglicher Realitätsnähe...