您的位置:首页 > 其它

关于Sleep的精度测试

2015-01-16 11:10 232 查看

一直在网上看到一些文章,说windows上面的Sleep精度如何不精确等等,在部门内部也引起了这方面的争论,为了证明事实,特意写下面的例子做测试。
测试的要点在,主线程Sleep一分钟,而子线程函数则以1~7毫秒作为Sleep单位,子线程里面,每Sleep一次则计数一次。同时,使用多个线程测试,如此两方面做对比,看效果。
测试结果证明,Sleep还是比较精确的,在有些电脑上,可以达到1毫秒之内的误差,而在有些电脑上,可以达到2毫秒以内的误差。
1毫秒之内误差的机器CPU是台式机:Intel(R)Core(TM)i3-3220 CPU @ 3.30GHz 3.30 GHz
2毫秒之内误差的机器CPU是笔记本:Intel(R)Core(TM)i5-2450 CPU @ 2.50GHz 2.49 GHz

#include <windows.h>

bool g_bStoped = false;
typedef struct ttt
{
int nSleepTime;
char tag[12];
}tt;
DWORD WINAPI ThreadRtspServer(LPVOID arg)
{
tt *p = (tt*)arg;
int nCount= 0;
while(!g_bStoped)
{
Sleep(p->nSleepTime);
nCount++;
}
fprintf(stderr, "%s has happened %d times\n", p->tag, nCount);
return 0;
}
#define MAXTHREAD 300
#define SLEEP_TIME 7
int _tmain(int argc, _TCHAR* argv[])
{
g_bStoped = false;
DWORD l_rtsp_tid = 0;
int nSleepTime=1;

tt arg[MAXTHREAD];
for (int i = 0; i < MAXTHREAD; i++)
{
tt * t = &arg[i];
t->nSleepTime = SLEEP_TIME;
sprintf(t->tag, "tag:%d", i);
CreateThread( NULL, 0, ThreadRtspServer, (LPVOID)t, 0, &l_rtsp_tid );
}
Sleep(60 * 1000);
g_bStoped = true;
Sleep(90000000);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: