Seite 1 von 1
Der Mythos: Delay(0) schont die CPU
Verfasst: 15.03.2013 15:56
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:

Legende zur Grafik:
- Schleife ohne Delay beginnt
- Schleife mit Delay(0) beginnt
- 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
Re: Der Mythos: Delay(0) schont die CPU
Verfasst: 15.03.2013 16:07
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.
Re: Der Mythos: Delay(0) schont die CPU
Verfasst: 15.03.2013 16:15
von ts-soft
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
Re: Der Mythos: Delay(0) schont die CPU
Verfasst: 15.03.2013 16:26
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
Re: Der Mythos: Delay(0) schont die CPU
Verfasst: 15.03.2013 16:28
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.

Re: Der Mythos: Delay(0) schont die CPU
Verfasst: 15.03.2013 16:37
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.

Re: Der Mythos: Delay(0) schont die CPU
Verfasst: 15.03.2013 16:49
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.
Re: Der Mythos: Delay(0) schont die CPU
Verfasst: 16.03.2013 04:46
von Helle
Delay(0) erhöht sogar leicht die CPU-Auslastung. Siehe:

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.