Genaue Zeitmessung in C

martinibook

martinibook

Aktives Mitglied
Thread Starter
Dabei seit
20.08.2005
Beiträge
8.730
Reaktionspunkte
350
Hallo,

Ich möchte in einem C Programm eine Zeit messen, dazu brauche ich allerdings die Zeit genauer als auf eine Sekunde. Wie geht das?

Martin
 
gettimeofday() ist auf die Mikrosekunde genau.
 
Was für eine Zeit möchtest du denn messen? Für eine schnöde Zeitmessung mache ich das meist indem ich gettimeofday(2) zwei mal aufrufe und dann die Differenz berechne. Das ist auf die Mikrosekunde genau.

Vielleicht reicht das ja auch für dich. :)
 
tickcount ist dein freund...
 
Ich stelle mich vielleicht was blöd an, aber ich habe jetzt folgendes:

Code:
#include <stdio.h>
#include <time.h>
#include <iostream>

int main ()
	{	
	printf("%f", gettimeofday(0));
	}

Ich bekomme dann folgende Meldungen:
error: too few arguments to function 'int gettimeofday(timeval*, timezone*)
'error: at this point in file

Was mache ich da falsch?
 
du kannst immer noch eine API lesen, das machst du falsch ;)

man gettimeofday
 
Wie die Meldung schon sagt, Du übergibst der Funktion zu wenig Argumente, schau Dir die Beschreibung der Funktion mal an.
 
Verstehe ich das richtig, dass ich der Funktion eine Struktur übergeben muss (als Zeiger), in die die Funktion dann die Werte einsetzt?
 
Zuletzt bearbeitet:
guck dir mal in der Xcode doku TickCount an, falls es das C prog für den mac ist...
da musst du nichts als parameter nutzen...
 
Also jetzt habe ich:

Code:
#include <stdio.h>
#include <time.h>
#include <iostream>
#include <OSUtils.h>

int main ()
	{
	unsigned int zeit;
	
	zeit = TickCount ();
	
	printf("%d", zeit);
	}

Allerdings sagt er mir, dass weder OSUtils.h gefunden werden kann, noch dass TickCount definiert ist. Was ist diesmal das Problem?
 
martinibook schrieb:
Allerdings sagt er mir, dass weder OSUtils.h gefunden werden kann, noch dass TickCount definiert ist. Was ist diesmal das Problem?
Im Prinzip brauchst du da gar nichts zu includieren. Du musst nur gegen das richtige Framework linken, in diesem Fall Carbon. Also in etwa
Code:
gcc -framework Carbon test.c


Allerdings finde ich TickCount eher bescheiden. Was sind schon 1/60-Sekunden? Und wenn ich dann noch in der Reference Library lesen muss
Do not rely on the tick count being exact; it is usually accurate to within one tick, but this level of accuracy is not guaranteed.
stellen sich mir die Nackenhaare hoch und rollen sich die Fußnägel auf. :eek:



PS: iostream hat in einem C-Programm aber mal gar nix zu suchen. :hehehe:
 
So, nun geb ich auch meinen Senf dazu.

[SENF]
Es reicht, das CoreServices Framework hinzuzuziehen.
autoexec.bat schrieb:
Allerdings finde ich TickCount eher bescheiden. Was sind schon 1/60-Sekunden?
na ja, sind halt Schwankungen in der Größenordnung von 30 ms. Wenn er grob über den Daumen gepeilt etwa in 1 Sekunde nicht mehr als 10 mal sample-t, gibt es vielleicht brauchbare Ergebnisse.

Die genaueste Methode ist mach_absolut_time():
Technical Q&A 1398: Mac Absolute Time Units
Hat gegenüber gettimeofday() fast keinen Overhead, ist aber schön unportabel.

Grüße,

Kay
[/SENF]
 
Zuletzt bearbeitet:
autoexec.bat schrieb:
PS: iostream hat in einem C-Programm aber mal gar nix zu suchen. :hehehe:

Man könnte auch sagen: printf("%d"§&#... hat in einem Programm, das <iostream> inkludiert nichts zu suchen... :)

cout << zeit;
 
Es gibt also nicht einfach eine Funktion, die den Timestamp einfach auf einige Nachkommastellen ausgibt?
 
martinibook schrieb:
Es gibt also nicht einfach eine Funktion, die den Timestamp einfach auf einige Nachkommastellen ausgibt?
Der Beispielcode aus dem Q&A ist doch IMHO durchaus handhabbar und lässt sich auf einen Zweizeiler reduzieren. Nur der cast *(uint64_t*) (&...) ist etwas irritierend aber notwendig.

"Genauere" Zeitmessung gibt es unter Mac OS X nicht; es sei denn Du gehst runter auf Taktzyklenebene. Das lässt sich aber auf PowerPC-Hardware meines Wissens nicht ohne Kernelextension realisieren. (auf intel ists aber kein Problem.) Die Werte hier sind ohnehin schon einigermassen verrauscht.

Du musst /System/Library/Frameworks/CoreServices.framework zum Projekt hinzufügen.
PHP:
#include <unistd.h>
#include <mach/mach.h>
#include <mach/mach_time.h>
#include <CoreServices/CoreServices.h>

uint64_t TimeNanoseconds(void)
{
	uint64_t t = mach_absolute_time();
	return * (uint64_t*) (&AbsoluteToNanoseconds(* (AbsoluteTime*) &t));
}

int main( int argc, char** argv)
{
	uint64_t start = TimeNanoseconds( ), elapsed;

	sleep(4);
	
	elapsed = TimeNanoseconds( ) - start;
	
	printf("%d sec %03d ms %03d micro %03d nano \n",		
		(uint32_t) ((elapsed / 1000000000) % 1000 ),
		(uint32_t) ((elapsed / 1000000) % 1000 ),
		(uint32_t) ((elapsed / 1000) % 1000),
		(uint32_t) ( elapsed % 1000 ));
}
 
Zuletzt bearbeitet:
Zurück
Oben Unten