Der Mythos: Delay(0) schont die CPU

Windowsspezifisches Forum , API ,..
Beiträge, die plattformübergreifend sind, gehören ins 'Allgemein'-Forum.
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Der Mythos: Delay(0) schont die CPU

Beitrag von helpy »

Hallo zusammen,

ich habe nun des öfteren gelesen:
  • Delay(0) schont die CPU
  • Gewöhne Dir an Delay(0) zu verwenden
Ich habe jetzt mal einen Test gemacht mit folgendem kleinen Programm:

Code: Alles auswählen

EnableExplicit

Procedure LoopCount( LoopTime, DelayTime = -1 )
	Protected Difftime, StartTime, LoopCount
	StartTime = ElapsedMilliseconds()
	Repeat
		LoopCount + 1
		If DelayTime >=0 : Delay(DelayTime) : EndIf
		Difftime = ElapsedMilliseconds() - StartTime
		If Difftime > LoopTime : Break : EndIf
	ForEver
	ProcedureReturn LoopCount
EndProcedure

Define i, msg.s

MessageRequester("Delay(0) Test","START")

For i = -1 To 1
	msg + RSet(Str(i),2) + " ==> " + Str(LoopCount(20000,i)) + #CRLF$
Next i

MessageRequester("Delay(0) Test", msg)
Mit Sysinternals Prozess Explorer habe ich mir die CPU-Auslastung des Programms angesehen:

Bild
Legende zur Grafik:
  1. Schleife ohne Delay beginnt
  2. Schleife mit Delay(0) beginnt
  3. Schleife mit Delay(1) beginnt
Testumgebung:
  • Windows 7 Enterpreise 64 Bit
  • PureBasic 5.11 Beta 3 64 Bit ohne Debugger
  • Prozessor Intel Core i7 CPU 870 @ 3GHz
Ergebnis:
  • Ohne Delay und mit Delay(0) belastet die Schleife einen der vier CPU-Kerne zu 100% (25% des Gesamtsystems)
  • Mit Delay(0) verbraucht jedoch das System einen großen Teil der Rechenzeit (rote Kurve)
  • Mit Delay(1) belastet die Schleife das System mit ca. 0,2%
Wozu also Delay(0) verwenden?

Gruß,
Guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Re: Der Mythos: Delay(0) schont die CPU

Beitrag von bobobo »

Delay(0) war bevor die Null erfunden wurde (Babylon ca. 305–63 v.Chr.)
PB hat das damals immer automatisch in eine 1 umgesetzt.
Seitdem muss man natürlich delay(1) ensetzen.
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Der Mythos: Delay(0) schont die CPU

Beitrag von ts-soft »

:mrgreen:

siehe MSDN Sleep
Abschnitt Remarks

Die 0 begründet sich also auf der Tatsache, das unter Windows für Delay() die Win-API Sleep genutzt wird und das hat
nicht viel mit Babylon zu tun <)

PS: Dieser Thread gehört nach Windows, nicht nach Allgemein, Delay() basiert nur unter Windows auf der Sleep-API,
unter anderen OS hat die 0 keine besondere Bedeutung!

Gruß
Thomas
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Der Mythos: Delay(0) schont die CPU

Beitrag von helpy »

Danke Thomas,

ich lerne immer wieder etwas neues dazu!

Hier ein Ausschnitt aus der MSDN
[url=http://msdn.microsoft.com/en-us/library/windows/desktop/ms686298%28v=vs.85%29.aspx]MSDN Sleep[/url] hat geschrieben:A value of zero causes the thread to relinquish the remainder of its time slice to any other thread that is ready to run. If there are no other threads ready to run, the function returns immediately, and the thread continues execution.

Windows XP: A value of zero causes the thread to relinquish the remainder of its time slice to any other thread of equal priority that is ready to run. If there are no other threads of equal priority ready to run, the function returns immediately, and the thread continues execution. This behavior changed starting with Windows Server 2003.

A value of INFINITE indicates that the suspension should not time out.
Das Betriebssystem schaltet doch auch automatisch zwischen den laufenden Threads um.

Was ist dann ein sinnvoller Einsatz von Delay(0)?
Wann ist es sinnvoll bewusst Rechenzeit an (irgendeinen anderen) Thread abzugeben?

Danke schon mal,
Guido
Windows 10
PB Last Final / (Sometimes testing Beta versions)
Benutzeravatar
helpy
Beiträge: 636
Registriert: 29.08.2004 13:29

Re: Der Mythos: Delay(0) schont die CPU

Beitrag von helpy »

bobobo hat geschrieben:Delay(0) war bevor die Null erfunden wurde (Babylon ca. 305–63 v.Chr.)
PB hat das DAMALS immer automatisch in eine 1 umgesetzt.
:lol:
Windows 10
PB Last Final / (Sometimes testing Beta versions)
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

Re: Der Mythos: Delay(0) schont die CPU

Beitrag von NicTheQuick »

Das ist sicherlich praktisch, wenn du mit mehreren Threads arbeitest und keine Mutexe oder Semaphoren benutzen willst um auf einen anderen Thread zu warten. Aber sinnvoll ist es natürlich nicht. Es gibt keinen Grund diese Funktionalität irgendwo zu nutzen. Java bietet das auch an: Java - Thread - yield(). Wir sollten das mal in einem Projekt nutzen um ein Busy-Wait zu implementieren. Aber das sollte eigentlich allen Studenten nur zeigen, dass es blöd ist. :D
Benutzeravatar
TroaX
Beiträge: 684
Registriert: 08.03.2013 14:27
Computerausstattung: PC: Ryzen 9 3950X, 96 GB RAM, RX6800XT, 2.5 TB SSD, 21:9 Display, Linux Mint | Lappi: Ryzen 7 5800H, 16 GB RAM, 1 TB SSD, Linux Mint
Wohnort: NRW
Kontaktdaten:

Re: Der Mythos: Delay(0) schont die CPU

Beitrag von TroaX »

Es gibt einen sogenannten Prozessorzeitplan, der deinen Programm Prozessorzeit zuweist. Das wird deswegen mit einem Zeitplan gemacht, um so ineinander verschränkt mehrere Prozesse auf einem physikalischen Prozessor (Kern) nach und nach abarbeiten zu lassen. Aber ich denke das dürfte nichts neues sein. Mit Delay gibt man dem Zeitplan die Möglichkeit, die Zeit auf die dein Programm verzichtet an einen anderen Thread zu übergeben. Setzt du kein Delay ein nimmt dein Programm zum Beispiel während einer Schleife den gesamten Zeitplan für einen physikalischen Prozessor in Anspruch und die KKern-Auslastung schießt nach oben. Ich nutze gar kein Delay(0) sondern immer Delay(1). Man sollte aber bedenken, das dein Programm pro Schleifendurchlauf auch diese Millisekunde länger brauch. Wenn du das nicht willst lagere am besten solche Schleifen in einen Thread aus und lass das Delay weg. Das OS mapped den Thread auf einen anderen Kern und den kannste ja bis zur Vergasung rechnen lassen. Aber ich würde mich auf Delay(0) nicht verlassen. An deinem Screenshot lese ich zumindest heraus, das es dir gar nichts bringt.
PC: Ryzen 9 3950X | 96 GB RAM | RX6800XT | 2,5 TB NVMe | Linux Mint
Notebook: 16" 3:2 | Ryzen 7 5800H | 16 GB RAM | Radeon Vega | 1TB NVMe | Linux Mint
NAS: Fritz.Box 5690 Pro (Nur für Keepass-DB)
Coding: Purebasic, Spiderbasic, GDevelop, Javascript/Node
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Re: Der Mythos: Delay(0) schont die CPU

Beitrag von Helle »

Delay(0) erhöht sogar leicht die CPU-Auslastung. Siehe:
Bild
Helpys Testcode wurde bei 60s gestartet und bei 180s nochmal. Man beachte den Wechsel zwischen User- und OS-Mode!
Delay(1) geht im Rauschen der anderen Instruktionen unter.
Gruß
Helle

Edit: Power hinzugefügt.
Antworten