【问题标题】:C Unix Millisecond Timer returning difference of 0C Unix 毫秒计时器返回差异为 0
【发布时间】:2013-08-26 04:42:19
【问题描述】:

谁能解释为什么我总是从下面的代码中得到时间 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);

【问题讨论】:

  • 因为读取时间可能不到 1 毫秒?
  • “我什至尝试了微秒,以防我的系统在不到 1 毫秒内执行它。”还有其他建议吗?
  • 你是如何尝试微秒的? (你知道这些函数实际上没有微秒级分辨率吗?)
  • 根据link useconds 是微秒测量变量,我在上面的代码中使用了这个变量。
  • @H2CO3: gettimeofday 在任何体面的系统上都有完整的微秒分辨率。 clock_gettime 具有完整的纳秒分辨率。

标签: c unix timer


【解决方案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 定义为整数会不必要地将结果缩短到整毫秒。这里可以考虑浮点数。

【讨论】:

    【解决方案2】:

    假设您的结果是在 mtime 中: mtime 是整数,你用浮点数计算经过的时间,所以如果

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

    评估为

    只需将 mtime 类型更改为浮动,或者如果你可以保持微秒使用

    ((seconds) * 1000000 + useconds) + 500
    

    【讨论】:

    • 那我该如何解决呢?
    • 已添加解决方案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多