[Python-de] präzise Zeitmessung unter Linux

"Martin v. Löwis" martin at v.loewis.de
Mi Okt 1 18:59:33 UTC 2008


> was ist die präziseste Art die Uhrzeit auf einem Rechner zu messen?

Auf einem Ein-Prozessor-System von Intel: die rdtsc-Anweisung, die
den Time Stamping Counter (TSC) ausliest. Dieser zählt (entgegen
seinem Namen) keine Zeitstempel, sondern Prozessortakte. Je nach
CPU hat das eine Frequenz von ca. 2GHz, also eine Auflösung von
einer knappen Nanosekunde.

Deshalb muss man mit rdtsc wenigstens zuerst eine Messung machen,
wieviel Takte der Prozessor pro Sekunde ausführt (z.B.); danach
kann man dann mit rdtsc auch Zeit stoppen.

Eine Falle sind Taktfrequenzänderungen der CPU: je nach CPU zählt
der TSC tatsächlich Takte (die dann länger dauern, wenn die Frequenz
fällt), oder aber der Prozessor versucht, den TSC-Fortschritt an
die geänderte Taktfrequenz anzupassen. Details stehen im
Intel-Handbuch. Am besten ist es, wenn man die Frequenzanpassung
ausschalten oder sonst irgendwie ausschließen kann.

time.time() nimmt gettimeofday(2). gettimeofday ist primär durch den
Timerinterrupt getrieben (der, je nach Kernel, alle 1ms bis 10ms
eintrifft). Neuere Linux-Versionen interpolieren die Zeit zwischen
zwei Timerinterrupts mit Hilfe des TSC. Das API von gettimeofday
erlaubt eine Granularität von Mikrosekunden.

Um die Timerauflösung zu ermitteln, kannst Du folgendes laufen
lassen:

import time
for i in range(100):
    t1=time.time()
    while 1:
        t2 = time.time()
        if t2!=t1:
            break
    print ((t2-t1)*1000000),

Das gibt in einer Endlosschleife an, in welchen Schritten sich
die Zeit ändert, in Mikrosekunden. Wenn da Werte wie 1000 oder
10000 rauskommen, dann hast Du eine Genauigkeit im
Millisekundenbereich. Bei mir kommt ca. 1 oder 2 raus, was
heißt; Python rechnet langsamer, als die Uhr weitergeht. Die
Genauigkeit ist bei mir also im Mikrosekundenbereich
(Linux 2.6.25, auf einem 3.2GHz-Prozessor).

Ciao,
Martin



Mehr Informationen über die Mailingliste python-de