2013-08-26 47 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爲整數會不必要地切斷結果完整毫秒。這裏可能會考慮浮動。