2013-08-26 43 views
1

任何人都可以解释为什么我总是会从下面的代码中得到0的时间?我只是想要一个毫秒计时器来计算从套接字发送和接收数据之间的延迟,但不管我尝试什么,我总是得到0的结果......我甚至试过微秒,以防万一我的系统在低于1毫秒。C Unix毫秒计时器返回差值0

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); 
+0

因为阅读时间不到1毫秒,也许? – 2013-08-26 04:44:19

+0

“我甚至试过微秒,以防万一我的系统在不到1ms内执行它。”还有其他建议吗? – T3CHN0CR4T

+0

你是怎么试微秒的? (你知道这些函数实际上没有微秒的分辨率吗?) – 2013-08-26 04:48:17

回答

0

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

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

评估为< 1.0铸造整数将削减到0

只需更改的mtime型浮动,或者如果你能保持微秒使用

((seconds) * 1000000 + useconds) + 500 
+0

那我该如何解决呢? – T3CHN0CR4T

+0

解决方案添加到答案 –

0

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为整数会不必要地切断结果完整毫秒。这里可能会考虑浮动。