[問題] 如何暫停microsecond等級的時間?

作者: liataian (T-PANY FOREVER)   2015-02-15 16:43:52
各位版友好,有些關於時間方面的問題想請教大家一下
最近在用c++寫簡單的socket程式,內容為Client端每隔幾秒要傳資料給Server端這樣
因為要做研究的關係,我想知道Client每隔1秒或是每隔1.000010秒傳資料給Server
對於我們想知道的結果會有什麼影響, 但是這就是會遇到問題了
就我這幾天網上查的結果, 似乎沒有任何一個function可以達到microsecond等級的暫停
即使我用usleep(1000010)也沒辦法精確的暫停1.000010秒
畢竟系統呼叫usleep()這個function似乎就要1ms到2ms的時間了(?)
對於usleep()我是這樣計算時間的:
#include <iostream>
#include <sys/time.h>
using namespace std;
int main(){
timeval t1, t2;
double elapsedTime;
gettimeofday(&t1, NULL);
usleep(1000010); //睡1.000010秒
gettimeofday(&t2, NULL);
elapsedTime = (t2.tv_sec - t1.tv_sec);
elapsedTime += (t2.tv_usec - t1.tv_usec) / 1000000.0;
cout << elapsedTime << " seconds.\n";
return 0;
}
嘗試多次的結果, elapsedTime還是會比預期多1ms到2ms
不知道這跟系統的timer resolution有沒有關係?
我在MAC OSX上用以下的code所測到timer resolution為3~5 microsecond左右
#include <iostream>
#include <ctime>
#include <unistd.h>
using namespace std;
int main()
{
clock_t t1, t2;
t1 = t2 = clock();
// loop until t2 gets a different value
while(t1 == t2){
t2 = clock();
}
// print resolution of clock()
cout << (double)(t2 - t1) / CLOCKS_PER_SEC * 1000000.0 << " us.\n";
return 0;
}
對於暫停microsecond等級的時間版友有任何想法可以提點一下嗎?
先謝謝各位!
作者: LiloHuang (十年一刻)   2015-02-15 16:47:00
一般來說會用 select() 來做,經驗上來說比較精確些
作者: lf5471 (lf)   2015-02-15 17:28:00
timer 這種東西, 很難準的, 和跑的 OS & H/W 有關.我曾跑過 FreeRTOS ...等一些嵌入式系統, 也沒法保證準確.只能"盡量"去做. 基本想法是針對你要實驗的那段 code提高它的 process or thread priority, 然後其他的,一些 service..有的沒的, 能關就盡量關.或是直接跑嵌入式, 上面只跑你那支程式 XDDD另外一個做法就是在相同環境, 做大量實驗.舉例: 你要 sleep 1ms, 但實際你是下 0.9ms, 其中 0.1ms是之前實驗告訴你的系統 overheadXDDD
作者: liataian (T-PANY FOREVER)   2015-02-15 19:47:00
lf大所言甚是XD 這方法我有try過,不過準確度很難捉摸XDLilo大說的select function我也會去研究看看, 謝謝兩位!
作者: dritchie (卍~邁斯納效應~卍)   2015-02-16 00:58:00
while loop然後拿rdtsc的結果出來比,檢查是否過了1ms
作者: liataian (T-PANY FOREVER)   2015-02-19 16:33:00
沒發現d大的留言!!... 感謝!
作者: EdisonX (卡卡獸)   2015-02-19 22:36:00
rdtsc 是個爭議…
作者: liataian (T-PANY FOREVER)   2015-02-20 15:51:00
E大,想問一下rdtsc在多核心上是不是會有問題呢??
作者: Killercat (殺人貓™)   2015-02-20 17:39:00
select(time_fd)已經是user space能用的最準確的了其他的不是平台限定 就是有移植問題rdtsc算是平台實作不同的作法就是另外基本上這個應該只有Intel/AMD有 其他都CPU都沒有
作者: EdisonX (卡卡獸)   2015-02-20 20:21:00
rdtsc 在多核上會有問題外 , 同時讓人意外的和電源管理有關.總結三個理由不用 rdtsc(這三個理由到各大論壇都可得)1. 不能保證每個 cores 的 TSC (Time Stamp Counter)同步2. 省電模式時(ex:NB) , CPU 時脈率會隨之變化,不是常數3. 亂序執行時取得的週期數不準Linux 下取代的方案我不熟,這個我就不贅述了。講到 rdtsc 好像有些離題了...
作者: liataian (T-PANY FOREVER)   2015-02-20 20:54:00
謝謝E大詳細解說,我也在四處看有沒有可用的函數, 不過這問題看來是受限於系統本身的限制, 暫時是無解了.. 我先改成用K大也提到select試試看有沒有辦法改善一點..^的
作者: Killercat (殺人貓™)   2015-02-21 00:03:00
select在新版linux kernel有幫你包好 叫做timefd直接用timefd可以省掉你非常多的麻煩不過普遍來講 select算是跨平台可兼容就是

Links booklink

Contact Us: admin [ a t ] ucptt.com