Ç的Unix毫秒定时器返回的0差(C Unix Millisecond Timer returnin

2019-09-28 00:00发布

任何人都可以解释为什么我总是从下面的代码得到的0时间? 我只想要一个毫秒计时器来计算发送和从套接字接收数据,但无论我怎么努力,我总是得到0的结果之间的延迟......我甚至尝试,以防万一我的系统在不到执行它微秒1毫秒。

    printf("#: ");

    bzero(buffer,256);
    fgets(buffer,255,stdin);

    struct timeval start, end;

    unsigned long mtime, seconds, useconds;    

    gettimeofday(&start, NULL);  

    n = write(clientSocket,buffer,strlen(buffer));

    if (n < 0)
    {
        error("Error: Unable to write to socket!\n");
    }

    bzero(buffer,256);
    n = read(clientSocket,buffer,255);

    gettimeofday(&end, NULL);

    seconds  = end.tv_sec  - start.tv_sec;
    useconds = end.tv_usec - start.tv_usec;

    mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;      

    if (n < 0) 
    {
        error("Error: Unable to read from socket!\n");
    }

    printf("%s\n",buffer);
    printf("Delay: %lu microseconds\n", useconds);

Answer 1:

useconds = end.tv_usec - start.tv_usec; 是值得怀疑与unsigned long useconds; 由于结果很可能是负的。

建议:

unsigned long end_us,start_us,elapsed_us;

   .
   .
   .

end_us     = end.tv_sec   * 1000000  +  end.tv_usec;
start_us   = start.tv_sec * 1000000  +  start.tv_usec;

elapsed_us = end_us - start_us;

printf("elapsed microseconds: %lu\n", elapsed_us);

和:

mtime = ((seconds) * 1000 + useconds/1000.0) + 0.5;  

是在太来看待:这试图转换为毫秒。 为什么你添加0.5目前尚不清楚。

建议:

elapsed_ms = elapsed_us / 1000;

但是,在定义elapsed_ms作为整数将结果不必要削减到全毫秒。 浮子可以在这里考虑。



Answer 2:

假设你的结果就是修改时间:修改时间为整数,你算算经过时间与浮点数所以如果

((seconds) * 1000 + useconds/1000.0) + 0.5

计算结果为<1.0铸造到整数将它切断成0

简单地改变的mtime型浮动,或者如果你能保持微秒使用

((seconds) * 1000000 + useconds) + 500


文章来源: C Unix Millisecond Timer returning difference of 0
标签: c unix timer