1.
windows上的sleep最小间隔可以精确到1ms,但是linux上sleep函数需要注意几个地方:
1,usleep(int microseconds)是旧式API,虽然参数是微妙,但是在linux系统上如果间隔低于10毫秒,死循环的CPU占用率仍然很高,如果要用usleep,间隔最小值必须设置为10ms,10000微妙。windows上不存在这种问题,只要sleep的间隔有1ms,死循环CPU占用率很低。
2,kernel 2.0之后才提供了一个新版API:nanosleep(int microseconds),这个API才可以将间隔时间控制在微秒级。
参考
http://tldp.org/HOWTO/IO-Port-Programming-4.html
2.
nanosleep的取值限制问题可能导致cpu过高,可参考
https://blog.csdn.net/s_ddwqwd/article/details/82788838
3.
ps -eLo pid,lwp,pcpu |grep pid
配合pstack查找性能问题比较方便
4.
std sleep_for 和 usleep对比,测试结果:
1 67 usleep
2 74 sleep_for
3 62 usleep
4 61 sleep_for
5 60 usleep
6 60 sleep_for
7 60 usleep
8 60 sleep_for
9 61 usleep
10 60 sleep_for
11 62 usleep
12 60 sleep_for
13 60 usleep
14 60 sleep_for
15 60 usleep
16 60 sleep_for
17 60 usleep
18 61 sleep_for
19 61 usleep
20 60 sleep_for
std::this_thread::sleep_for(std::chrono::microseconds(5));
usleep(5);
25 for (int i = 0; i < 10; i++){
26
27 gettimeofday(&tv,&tz);
28 int64_t v = tv.tv_sec * 1000000 + tv.tv_usec;
29
30 usleep(5);
31
32 gettimeofday(&tv1,&tz1);
33 int64_t v1 = tv1.tv_sec * 1000000 + tv1.tv_usec;
34 cout << v1 - v << " usleep" << endl;
35
36 }
没什么大的差异,cpu占用上,sleep_for线程偏高,高于1-几倍吧,稳定性差,具体原因待分析