[问题] 如何暂停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