while, sleep() und performance

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
lethe
User
Beiträge: 3
Registriert: Montag 14. August 2006, 08:14

Hallo,

ich hätte mal eine generelle Frage zum Thema sleep().

Ich habe ein Script geschrieben, bei welchem, nach Eingabe einer Uhrzeit eine while-Schleife gestartet wird, (keine Abbruchbedingung).

In dieser while-Schleife teste ich, ob die eingebene Uhrzeit == der aktuellen System-Zeit ist und wenn ja, wird eine externe Anwendung gestartet und die Schleife verlassen (was aber auch egal ist, da es sich bei der Anwendung um die shutdown.exe handelt)

Nun frag ich mich jedoch, ob das dauernde laufen einer Schleife im Hintergrund nicht zu Perfomancefressend ist. Deswegen habe ich in die Schleife ein sleep(8) eingepackt, damit die Schleife nur alle ca. 8Sekunden durchlaufen wird (reicht für meine Zwecke völlig aus...)

Die Frage ist nur, wird das ganze durch das sleep() wirklich performanter oder macht das keinen Unterschied. (dazu müßte man wissen, wie sleep genau arbeitet)

Den Code hab ich grad leider nicht hier, aber da das ja ne allgemeine Frage zu sleep() ist, hoffe ich, reichts auch so...

Danke schonmal
Grüße
lethe
Gromit
User
Beiträge: 51
Registriert: Montag 8. Mai 2006, 19:07

8 Sekunden Pause sind kein Problem.

Aber ich frag mich, warum Du eine Schleife brauchst. Man kann doch
gleich nach der Eingabe die Zeitdifferenz berechnen und das Programm
dann die "richtige" Zeit schlafen lassen.

Die Schleife macht eigentlich nur Sinn, wenn jemand andauernd die Systemzeit "anpasst".
BlackJack

lethe hat geschrieben:In dieser while-Schleife teste ich, ob die eingebene Uhrzeit == der aktuellen System-Zeit ist [...]
Du solltest besser nicht auf Gleichheit testen, sondern ob die Systemzeit grösser oder gleich der eingegebenen Zeit ist. Sonst kann es passieren das Du den genauen Zeitpunkt verpasst und die Schleife weiterläuft.
Nun frag ich mich jedoch, ob das dauernde laufen einer Schleife im Hintergrund nicht zu Perfomancefressend ist.
Das wäre "busy waiting", der Prozess wäre ständig mit der Abarbeitung der Schleife beschäftigt. Keine gute Idee, wie Du ja selbst schon vermutest.
Die Frage ist nur, wird das ganze durch das sleep() wirklich performanter oder macht das keinen Unterschied. (dazu müßte man wissen, wie sleep genau arbeitet)
`sleep()` gibt die Kontrolle an das Betriebssystem zurück und der Prozess/Thread wird (mindestens) solange nicht mehr ausgeführt bis die Zeit verstrichen ist. Das bringt also etwas.
lethe
User
Beiträge: 3
Registriert: Montag 14. August 2006, 08:14

Danke euch für die guten Hinweise!
BlackJack hat geschrieben:Du solltest besser nicht auf Gleichheit testen, sondern ob die Systemzeit grösser oder gleich der eingegebenen Zeit ist. Sonst kann es passieren das Du den genauen Zeitpunkt verpasst und die Schleife weiterläuft.
das kann ich natürlich auch machen, aber da die beiden werte 1 minute lang gleich sind, hatte ich keine befürchtungen der zeitpunkt könnte verpasst werden. es ist jedoch keine arbeits das auf <= zu ändern und ist sicherlich "saueberer" stil. werds nachholen! (wenn sich die sleep-variante nicht bewährt)
Gromit hat geschrieben:Aber ich frag mich, warum Du eine Schleife brauchst. Man kann doch gleich nach der Eingabe die Zeitdifferenz berechnen und das Programm
dann die "richtige" Zeit schlafen lassen.
Hmm, das hatte ich schonmal überlegt...hatte es dann aber verworfen, da ja sleep nicht sekunden genau ist. allerdings brauche ich ja auch nicht wirklich sekundengenauigkeit, und im grunde genommen hast du natürlich recht, werds auf jeden fall testen!
BlackJack

lethe hat geschrieben:
BlackJack hat geschrieben:Du solltest besser nicht auf Gleichheit testen, sondern ob die Systemzeit grösser oder gleich der eingegebenen Zeit ist. Sonst kann es passieren das Du den genauen Zeitpunkt verpasst und die Schleife weiterläuft.
das kann ich natürlich auch machen, aber da die beiden werte 1 minute lang gleich sind, hatte ich keine befürchtungen der zeitpunkt könnte verpasst werden.
Ich dachte da z.B. an folgendes Szenario: `sleep()` wird mit der Zeitdifferenz benutzt und die ist, sagen wir mal eine Stunde. In dieser Stunde werden ein Haufen anderer Programme gestartet oder eine Anwendung, die viel Speicher braucht, mit dem Ergebnis, dass der schlafende Prozess auf Platte ausgelagert wird. Just zum Aufwachzeitpunkt läuft jetzt etwas das intensiv auf die Platte zugreift, Defrag z.B., und das verzögert erstmal das Aufwachen um ein paar Sekunden und dann muss der Prozess wieder eingelagert werden. Und das kann dann wenn man Pech hat mehr als 1 Minute dauern. Und schon ist's passiert.
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

Hi lethe!
lethe hat geschrieben: In dieser while-Schleife teste ich, ob die eingebene Uhrzeit == der aktuellen System-Zeit ist und wenn ja, wird eine externe Anwendung gestartet und die Schleife verlassen
Eine Totrechenschleife? :shock: Um Gottes Willen, mach das nicht!
lethe hat geschrieben: Nun frag ich mich jedoch, ob das dauernde laufen einer Schleife im Hintergrund nicht zu Perfomancefressend ist.
Fragt sich, wieviel Kaffee Du verträgst (den Du in den Wartepausen holen kannst ;))
lethe hat geschrieben: Die Frage ist nur, wird das ganze durch das sleep() wirklich performanter oder macht das keinen Unterschied. (dazu müßte man wissen, wie sleep genau arbeitet)
Wie Blacky schon sagte wird der Prozess auf Eis gelegt und benötigt somit fast gar keine Performance mehr. Ist also ein Unterschied wie Tag und Nacht.
BlackJack hat geschrieben: Ich dachte da z.B. an folgendes Szenario: `sleep()` wird mit der Zeitdifferenz benutzt und die ist, sagen wir mal eine Stunde. In dieser Stunde werden ein Haufen anderer Programme gestartet oder eine Anwendung, die viel Speicher braucht, mit dem Ergebnis, dass der schlafende Prozess auf Platte ausgelagert wird. Just zum Aufwachzeitpunkt läuft jetzt etwas das intensiv auf die Platte zugreift, Defrag z.B., und das verzögert erstmal das Aufwachen um ein paar Sekunden und dann muss der Prozess wieder eingelagert werden. Und das kann dann wenn man Pech hat mehr als 1 Minute dauern. Und schon ist's passiert.
Komisch, genau das ist mir gestern drei mal passiert. ;-) Dabei hätte ich doch, wenn ich den Prozess auf Zeitdifferenz schlafen lege, gar nicht mehr vergleichen brauchen, weil die Zeit MINDESTENS um ist. :)

Grüße,
der Michel
Diese Nachricht zersört sich in 5 Sekunden selbst ...
Antworten