C定时器差值返回0ms

时间:2015-09-07 11:11:21

标签: c timer clock milliseconds

我正在学习C(和Cygwin),并尝试为作业完成一个简单的远程执行系统。

我被挂断的一个简单要求是:'客户端将报告服务器响应每个查询所花费的时间。'

我已经尝试过搜索并实施其他有效的解决方案,但结果总是回到0。

我所拥有的片段:

#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);
}

我也试过使用浮点数,而不是除以1000,乘以10,000只是为了查看是否有任何闪烁的值,但总是回到0。 很明显,我实现这一点的方式肯定是错的,但经过多次阅读后我无法弄明白。

- 编辑 -

打印输出值:

clock_t start = clock(), diff;
printf("Start time: %lld\n", (long long) start);
//process stuff
sleep(2);
printf("End time: %lld\n", (long long) clock());
diff = clock() - start;

printf("Diff time: %lld\n", (long long) diff);
printf("Clocks per sec: %d", CLOCKS_PER_SEC);

结果: 开始时间: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);

2 个答案:

答案 0 :(得分:4)

我认为你误解了clock()sleep()

clock测量程序使用的CPU时间,但sleep将在不使用任何CPU时间的情况下休眠。也许您想要使用time()gettimeofday()代替?

答案 1 :(得分:2)

Cygwin意味着你在Windows上。

在Windows上,执行线程上的“当前时间”仅每64秒更新一次(大约16ms),因此如果clock()基于它,即使它返回了几毫秒,它也是如此永远不会比15.6ms精确。

GetThreadTimes()也有同样的限制。