C定时器差返回0毫秒
我正在学习C(和Cygwin),并试图完成一个简单的任务远程执行系统 我挂断电话的一个简单要求是:“客户端将报告服务器响应每个查询所花费的时间。” 我尝试过四处搜索并实现了其他工作解决方案,但结果总是返回0 我所拥有的一个片段:C定时器差返回0毫秒,c,timer,clock,milliseconds,C,Timer,Clock,Milliseconds,我正在学习C(和Cygwin),并试图完成一个简单的任务远程执行系统 我挂断电话的一个简单要求是:“客户端将报告服务器响应每个查询所花费的时间。” 我尝试过四处搜索并实现了其他工作解决方案,但结果总是返回0 我所拥有的一个片段: #include <time.h> for(;;) { //- Reset loop variables bzero(sendline, 1024); bzero(recvline, 1024); printf(">
#include <time.h>
for(;;)
{
//- Reset loop variables
bzero(sendline, 1024);
bzero(recvline, 1024);
printf("> ");
fgets(sendline, 1024, stdin);
//- Handle program 'quit'
sendline[strcspn(sendline, "\n")] = 0;
if (strcmp(sendline,"quit") == 0) break;
//- Process & time command
clock_t start = clock(), diff;
write(sock, sendline, strlen(sendline)+1);
read(sock, recvline, 1024);
sleep(2);
diff = clock() - start;
int msec = diff * 1000 / CLOCKS_PER_SEC;
printf("%s (%d s / %d ms)\n\n", recvline, msec/1000, msec%1000);
}
结果:
开始时间:15
结束时间:15
差异时间:0
每秒时钟数:1000
--最终工作代码--
#include <sys/time.h>
//- Setup clock
struct timeval start, end;
//- Start timer
gettimeofday(&start, NULL);
//- Process command
/* Process stuff */
//- End timer
gettimeofday(&end, NULL);
//- Calculate differnce in microseconds
long int usec =
(end.tv_sec * 1000000 + end.tv_usec) -
(start.tv_sec * 1000000 + start.tv_usec);
//- Convert to milliseconds
double msec = (double)usec / 1000;
//- Print result (3 decimal places)
printf("\n%s (%.3fms)\n\n", recvline, msec);
#包括
//-设置时钟
结构timeval开始、结束;
//-启动计时器
gettimeofday(&start,NULL);
//-进程命令
/*加工材料*/
//-结束计时器
gettimeofday(&end,NULL);
//-以微秒为单位计算差异
长整数usec=
(end.tv_sec*1000000+end.tv_usec)-
(start.tv_sec*1000000+start.tv_usec);
//-转换为毫秒
双毫秒=(双)usec/1000;
//-打印结果(小数点后3位)
printf(“\n%s(%.3fms)\n\n”,recvline,毫秒);
我想你误解了clock()
和sleep()
时钟
测量程序使用的CPU时间,但是睡眠
将在不使用任何CPU时间的情况下睡眠。也许你想用time()
或gettimeofday()
来代替?Cygwin意味着你在Windows上
在Windows上,执行线程上的“当前时间”仅每64秒(大约16毫秒)更新一次,因此如果clock()
基于它,即使它返回毫秒数,其精度也不会超过15.6毫秒
GetThreadTimes()
也有相同的限制。注意:我已经阅读了,但解决方案不起作用。原始的时钟值是多少printf(“%lld\n”,(long-long)start)
问题在于您的分配,您将差异分配给int
,它将为任何小于1的值分配0,使用float msec=float(clock()-start)/CLOCKS\u/SEC代码>取而代之。@chux我得到的值是46,这是否意味着它实际上工作正常,而我只是处理错误?最好发布前后时间值。时差可能低于您的时钟滴答声。2) 同时发布不会影响GetThreadTimes()
的CLOCKS\u PER_second
值,如果clock()
返回的值太小,可能是基于该值,而不是基于内部时钟。@MedinoctimeBeginPeriod
?@user877329这是用于多媒体计时器的,但它们也有可能被用于这样的测量目的。不过,高分辨率性能计数器可能更合适。谢谢!实现了time()
并使用difftime()
计算差异,但是这有转换为ms的分辨率吗?@Blake No-time
只需几秒钟,但是gettimeofday
可以更精确,IIRC。非常感谢,刚刚为未来的程序员添加了我的最终代码。很高兴看到StackOverflow今晚对我很好哈哈
#include <sys/time.h>
//- Setup clock
struct timeval start, end;
//- Start timer
gettimeofday(&start, NULL);
//- Process command
/* Process stuff */
//- End timer
gettimeofday(&end, NULL);
//- Calculate differnce in microseconds
long int usec =
(end.tv_sec * 1000000 + end.tv_usec) -
(start.tv_sec * 1000000 + start.tv_usec);
//- Convert to milliseconds
double msec = (double)usec / 1000;
//- Print result (3 decimal places)
printf("\n%s (%.3fms)\n\n", recvline, msec);