获取线程时间 . GetThreadTimes , 这个函数并不准
//转换函数
__int64 convert64(FILETIME ft)
{
// return (((__int64)ft.dwHighDateTime)<<32) | ft.dwLowDateTime;
ULARGE_INTEGER ui;
ui.LowPart = ft.dwLowDateTime;
ui.HighPart = ft.dwHighDateTime;
return ui.QuadPart;
}
FILETIME ctime,etime,ktime,utime;
FILETIME ctime2,etime2,ktime2,utime2;
GetThreadTimes(GetCurrentThread(),&ctime,&etime,&ktime,&utime);
Sleep(3000); //执行别的
GetThreadTimes(GetCurrentThread(),&ctime2,&etime2,&ktime2,&utime2);
cout << convert64(ctime) << "," <<convert64(etime) << "," <<convert64(ktime) << "," <<convert64(utime) << endl;
cout << convert64(ctime2) << "," <<convert64(etime2) << "," <<convert64(ktime2) << "," <<convert64(utime2) << endl;
cout << "elapsed:" << convert64(ktime2) - convert64(ktime) + (convert64(utime2) - convert64(utime)) << endl;
//这个版本或许比较准确;
//QueryPerformanceFrequency 获取计数器的频率
//QueryPerformanceCounter 高精度计时器的值,精确定时器
LARGE_INTEGER large_interger;
__int64 f,first,second;
//获取频率 , 微秒为单位
QueryPerformanceFrequency(&large_interger);
f = large_interger.QuadPart; //QuadPart 的类型 == __int64
//第一次
QueryPerformanceCounter(&large_interger);
first = large_interger.QuadPart;
Sleep(1000);
QueryPerformanceCounter(&large_interger);
second = large_interger.QuadPart;
printf("fre:%I64d\n", f);
printf("elapsed time (ms) :%I64d\n", (second -first) * 1000 / f ); //微秒
一个简单的函数获取当前线程的周期数:
unsigned __int64 getCycles(DWORD msec)
{
int pri = GetThreadPriority(GetCurrentThread());
//把当前线程优先级设置为最高或许比较准确;
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
unsigned __int64 start = ReadTimeStampCounter();
Sleep(msec);
SetThreadPriority(GetCurrentThread(),pri);
return ReadTimeStampCounter() - start;
}
不考虑多核的情况下计算频率
//以微秒计算频率
__int64 getThreadCpuFrequencyInMHZ()
{
int pri = GetThreadPriority(GetCurrentThread());
SetThreadPriority(GetCurrentThread(),THREAD_PRIORITY_HIGHEST);
LARGE_INTEGER li;
__int64 fre, c1,c2;
//获取频率
QueryPerformanceFrequency(&li);
fre = li.QuadPart;
//获取计数器
QueryPerformanceCounter(&li);
c1 = li.QuadPart;
QueryPerformanceCounter(&li);
c2 = li.QuadPart;
// 计算一个起始值
__int64 starttime = (c2-c1)*1000000 / fre;
//起始周期数
unsigned __int64 start_cycle = ReadTimeStampCounter();
//等1秒
Sleep(1000);
//经过了多少周期数
unsigned __int64 n_cycle = ReadTimeStampCounter() - start_cycle;
QueryPerformanceCounter(&li);
__int64 c3 = li.QuadPart;
__int64 endtime = (c3-c1)*1000000 / fre;
__int64 elapsed = endtime - starttime;
SetThreadPriority(GetCurrentThread(),pri);
return n_cycle / elapsed;
}