Seite 1 von 1

Bewusste Verzögerung von Prozessen

Verfasst: Dienstag 25. März 2008, 17:49
von numerix
Um eine graphische Animation darzustellen brauche ich eine absichtlich verzögerte Darstellung. Diese soll möglichst so realisiert werden, dass auf unterschiedlichen Rechnern und Betriebssystemen (insbesondere Linux und Windows) in etwa die gleiche Animationsgeschwindigkeit erzielt wird.

Meine bisherige Lösung sieht so aus, dass ich kleine Zeitverzögerungen einbaue. Auf meinem Linuxsystem kann ich mittels time.time() ausreichend kleine Zeitintervalle (im zweistelligen Mikrosekundenbereich) messen und das ganze so realisieren, wie ich es gerne hätte.

Nun kann man ja in der Dokumentation dazu nachlesen, dass time.time() auf unterschiedlichen Betriebssystemen durchaus wesentlich ungenauer sein kann. Auf einem Windowssystem kann ich es derzeit aber nicht testen.

Die Empfehlung der Doku - time.clock() - zu verwenden, entfällt für Linux.
Mit dem timeit-Modul habe ich es ebenfalls nicht in der gewünschten Genauigkeit realisieren können.

Die after()-Methode von Tkinter ist mit mind. 1 ms ebenfalls nicht zu gebrauchen.

Frage(n) also:
Ist die Idee mit den eingebauten Wartezeiten für die Animation an sich schlecht? Kann man das anders besser lösen?
Wenn es die beste Lösung ist: Ist time.clock() unter Windows genau genug, um die gewünschten kurzen Zeiten messen zu können?

Edit: time.sleep() habe ich natürlich auch getestet; ist aber zu träge bzw. ungenau, jedenfalls unter Linux.

Verfasst: Dienstag 25. März 2008, 19:02
von Holzdolph
wer bemerkt denn bitte eine verzögerung um max. 99E-6 sekunden ? wenn deine gesamte animation 1000 schritte hat hat sich die gesamte animationszeit um ~0.1s erhöht, und das für den worst case deiner 2stelligen verzögerung, also im mittel um etwa 0.05s.

wenn also jede mikrosekunde zählt, wozu dann überhaupt eine verzögerung einbauen. und falls doch nicht, kannst nicht an anderer stelle verzögern damit du nicht so kleine intervalle brauchst ?

Verfasst: Dienstag 25. März 2008, 19:35
von numerix
Da eine annähernd "stufenlose" Regelung der Animationsgeschwindigkeit ermöglicht werden soll und die Animation gleichzeitig so flüssig wie möglich ablaufen soll, benötige ich einen möglichst kleinen Basiszeitraum, auf den ich mich stützen kann.

Verzögerungen unter 0.1 ms kann man durchaus wahrnehmen, wenn die Anzahl der Schritte groß genug ist. Aber viel ist das natürlich nicht, das hast du schon recht. Durch Multiplikation mit dem Basisfaktor ergeben sich dann auch Werte über 1 ms; aber dann ist es eben auch schon langsam.

Wie genau ist denn nun time.clock() unter windows?

Vielleicht könnte jemand folgendes mal unter Windows mit time.time() und time.clock() durchführen. Das wäre nett.

Code: Alles auswählen

>>> import time
>>> "%.3f ms" %(abs(time.time()-time.time())*1000)
'0.006 ms'
Korrektur zum letzten Posting: Mit timeit komme ich etwa auf 0.01 ms herunter.

Verfasst: Dienstag 25. März 2008, 19:52
von Holzdolph
habs gerade ein paar mal durchgeführt, das gibt immer 0.0 ms zurück.

edit:
mit time.clock() funktionierts:

Code: Alles auswählen

>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00196 ms
>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00223 ms
>>> print "%.5f ms" % (abs(time.clock()-time.clock())*1000)
0.00168 ms

Verfasst: Dienstag 25. März 2008, 20:11
von numerix
Vielen Dank, das hilft.

Kann es jemand mal mit Mac OS checken?
Mit time.time() und time.clock()? Das wäre nett.