HSG |
|
Um eine Vorstellung von der Genauigkeit des tkinter-Timers after zu bekommen, wurden an einem tkinter-Programm, das mit after periodisch pollt, Messungen vorgenommen. Die Zeitdifferenzen werden in eine Liste geschrieben und später ausgewertet. Eine Ausgabe auf die Konsole würde vermutlich zu sehr stören.
import time def zeit(): # todo: angepasst an Betriebssystem return time.time() zeiten = [] # DEBUG für Pollzeiten
Code-Schnipsel in der poll-Routine
def poll(self): # Anfang DEBUG für Pollzeiten t = zeit() tp = t-self.t1 self.t1 = t zeiten.append(tp) # Ende DEBUG für Pollzeiten .........
Für ein Intervall von 9 ms ergab sich z.B.
>>> print(zeiten) [0.018613100051879883, 0.02557992935180664, 0.009352922439575195, 0.00939321517944336, 0.009382009506225586, 0.009354829788208008, 0.009339094161987305, 0.009505033493041992, 0.009367942810058594, 0.009361982345581055, 0.009385108947753906, 0.009358882904052734, 0.009320974349975586, 0.009360074996948242, .........
Was sofort auffällt ist eine anfängliche starke Abweichung, die sich dann aber einpendelt. Natürlich muss der Code der poll-Routine auch bearbeitet werden, der hier ca. 0,0003s dauert.
Eine Wiederholung mit 9ms ergab
>>> print(zeiten) [0.029700040817260742, 0.0869150161743164, 0.1218259334564209, 0.00937509536743164, 0.009321928024291992, 0.009264945983886719, 0.00941610336303711, 0.009367942810058594, 0.009394168853759766, 0.009331941604614258, 0.009238004684448242, 0.009222030639648438, 0.009285926818847656, 0.009309053421020508, ................
Für 5ms ergab sich
>>> print(zeiten) [0.03821897506713867, 0.10904097557067871, 0.007650136947631836, 0.15894198417663574, 0.00545191764831543, 0.0054111480712890625, 0.005304813385009766, 0.00526118278503418, 0.0052928924560546875, 0.005301952362060547, 0.0052950382232666016, 0.005288124084472656, 0.005301952362060547, 0.00529789924621582, ............
Für 3ms ergab sich
>>> print(zeiten) [0.03104710578918457, 0.1000819206237793, 0.02203202247619629, 0.10915493965148926, 0.0033540725708007812, 0.003290891647338867, 0.0033631324768066406, 0.0031938552856445312, 0.003353118896484375, 0.0031790733337402344, 0.0032989978790283203, 0.0031659603118896484, 0.0033049583435058594, 0.003331899642944336,.............
Für 1ms ergab sich
>>> print(zeiten) [0.036463022232055664, 0.12449193000793457, 0.00631403923034668, 0.1349489688873291, 0.0013420581817626953, 0.0012180805206298828, 0.0012040138244628906, 0.0011730194091796875, 0.0012798309326171875, 0.0013241767883300781, 0.0011539459228515625, 0.0011248588562011719, 0.0011191368103027344, 0.0011239051818847656, 0.0012359619140625, 0.0011401176452636719, 0.0011301040649414062, 0.0011279582977294922, 0.001127004623413086, 0.0012118816375732422, 0.0011310577392578125, 0.001132965087890625, 0.0011260509490966797, 0.0011279582977294922, ...........
Die Experimente wurden mit dem Programm bittransceiver.py auf einem Doppelkern-Rechner unter Ubuntu 10.10 gemacht. Es wäre sehr interessant, was sich bei anderen Rechnern und anderen Betriebssystemen ergibt. Es fällt auf, dass die ersten Werte viel länger sind als sie sein sollten. Vielleicht muss sich der Scheduler erst auf die periodischen Anforderungen einstellen. Der after zu übergebende Parameter muss vom Typ int sein, sodass kein kleinerer Wert als 1ms einstellbar ist.