CPU-Auslastung 95% :-)

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

CPU-Auslastung 95% :-)

Beitrag 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.?
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag von DrShrek »

ja, und Delay(1) ist ausreichend.
Probiers halt mal aus...
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Lukas-P
Beiträge: 262
Registriert: 07.10.2004 12:03

Beitrag 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:
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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.
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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. :|
Benutzeravatar
Delle
Beiträge: 1130
Registriert: 10.05.2005 22:48

Beitrag von Delle »

Die ganz normale Schleife Repeat / Until...
Benutzeravatar
bluejoke
Beiträge: 1244
Registriert: 08.09.2004 16:33
Kontaktdaten:

Beitrag 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
Ich bin Ausländer - fast überall
Windows XP Pro SP2 - PB 4.00
Benutzeravatar
MVXA
Beiträge: 3823
Registriert: 11.09.2004 00:45
Wohnort: Bremen, Deutschland
Kontaktdaten:

Beitrag 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 <_<
Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8809
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
traumatic
Beiträge: 478
Registriert: 27.11.2004 15:42

Beitrag 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...
Antworten