Измеряю время с помощью TSC (Time Stamp Counter).
Помогите, пожалуйста, перевести такты в секунды.
Проблема с константами CLOCKS_PER_SEC и _SC_CLK_TCK.
Не пойму как мне их использовать, значения явно получаются не те.
Мой вариант выглядит не очень красиво:#include <stdint.h>
#include <unistd.h>
#include <iostream>
using namespace std;
extern __inline__ uint64_t rdtsc() {
uint64_t x;
__asm__ volatile (".byte 0x0f, 0x31" : "=A" (x));
return x;
}
int main()
{
cout<<"run"<<endl<<endl;
uint32_t slp = 10;
uint64_t t1, t2;
t1 = rdtsc();
sleep(slp);
t2 = rdtsc();
cout<<hex<< "t1 = " << t1 <<endl<<dec<< "sleep("<< slp <<")"<<hex<<endl
<< "t2 = " << t2 <<endl;
cout<<dec<< "t2 - t1 = " << t2-t1 <<" (clocks)"<<endl<<endl;
cout<< "CLOCKS_PER_SEC = "<< CLOCKS_PER_SEC <<endl;
cout<< "sysconf(_SC_CLK_TCK) = "<< sysconf(_SC_CLK_TCK) <<endl<<endl;
cout<< (t2 - t1) / sysconf(_SC_CLK_TCK) <<endl;
cout<< (t2 - t1) / CLOCKS_PER_SEC <<endl;
cout<< (t2 - t1) / (CLOCKS_PER_SEC * sysconf(_SC_CLK_TCK)) <<endl<<endl;
uint32_t clocks_per_sec = (t2 - t1) / slp;
cout<< "clocks per second = "<< clocks_per_sec <<endl;
cout<< "sleep time = " << (t2 - t1) / clocks_per_sec <<endl;
return 0;
}
/*
=====================================================================
$ g++ tsc.cpp -o tsc
$ ./tsc
run
t1 = e777e903f8c8
sleep(10)
t2 = e77d83aa2f68
t2 - t1 = 24069420704 (clocks)
CLOCKS_PER_SEC = 1000000
sysconf(_SC_CLK_TCK) = 100
240694207
24069
240
clocks per second = 2406942070
sleep time = 10
=====================================
$ cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 15
model : 2
model name : Intel(R) Pentium(R) 4 CPU 2.40GHz
stepping : 7
cpu MHz : 2405.487
cache size : 512 KB
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 2
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm
bogomips : 4797.23
*/
P.S.: Прошу ногами не пинать, я начинающий программист в UNIX/Linux