Hallo,
ich muss möglichst exakt die Laufzeit von einem Programm messen. Die time.h ist viel zu ungenau und da das ganze eh unter nem Minimallinux laufen wird, um sinnvolle Ergebnisse zur bringen, bin ich auf die Idee gekommen, die Prozessor Ticks seit dem letzten Reset auszulesen. Die Funktion RDTSC erledigt das. Allerdings ist es ein 64bit Unsignend Integer - und sowas gibts in C wieder nicht. Folgendes Programmschnippsel:
Das ganze wird vor und nach dem Ausführen der Benchmarkfunktion ausgeführt und sollte entsprechend die Ticks zurückgeben, die ich dann durch die Prozessorfrequenz teilen kann, um ms zu bekommen. Problem ist jetzt, dass der Unsigned Integer nur 32bit lang ist und damit natürlich das verschieben um 32 Stellen nach links, um die beiden Register EAX und EDX zu kombinieren, in die Hose geht.
Meine Frage daher: wie schaffe ich es in C++, einen Ganzzahlwert aus zwei 32bit Integers zu basteln und mit dem zu rechnen?
Danke schon mal & gn8!
PS: tlow und tihigh sind globale Variablen vom Typ "unsigned int"
ich muss möglichst exakt die Laufzeit von einem Programm messen. Die time.h ist viel zu ungenau und da das ganze eh unter nem Minimallinux laufen wird, um sinnvolle Ergebnisse zur bringen, bin ich auf die Idee gekommen, die Prozessor Ticks seit dem letzten Reset auszulesen. Die Funktion RDTSC erledigt das. Allerdings ist es ein 64bit Unsignend Integer - und sowas gibts in C wieder nicht. Folgendes Programmschnippsel:
Code:
unsigned long rdtsc()
{
__asm( ".intel_syntax noprefix\n"
"pusha\n"
"rdtsc\n"
"mov _tlow, eax\n"
"mov _thigh, edx\n"
"popa\n"
);
unsigned long ticks = 0;
ticks ^= thigh;
ticks = ticks << 32;
ticks ^= tlow;
return ticks;
}
Meine Frage daher: wie schaffe ich es in C++, einen Ganzzahlwert aus zwei 32bit Integers zu basteln und mit dem zu rechnen?
Danke schon mal & gn8!
PS: tlow und tihigh sind globale Variablen vom Typ "unsigned int"