免费注册 查看新帖 |

Chinaunix

广告
  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: my1919_2005
打印 上一主题 下一主题

[C++] 高精度的SLEEP [复制链接]

论坛徽章:
1
天秤座
日期:2014-04-27 07:42:20
11 [报告]
发表于 2010-05-31 14:32 |只看该作者
使用时钟中断

论坛徽章:
0
12 [报告]
发表于 2010-05-31 14:33 |只看该作者

  1. typedef unsigned long long ticks;

  2. static __inline__ ticks getticks(void)
  3. {
  4.      unsigned a, d;
  5.      asm volatile("rdtsc" : "=a" (a), "=d" (d));

  6.      return (((ticks)a) | (((ticks)d) << 32));
  7. }
复制代码
用这个取CPU时钟周期来做延时可以精确到微秒。不过要先关BIOS中的CPU节能,以免CPU主频变化引起时钟频率变化。取到的时钟周期算具体的时间用cat /proc/cpuinfo里的主频数据,例如:

$ cat /proc/cpuinfo
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 31
model name      : AMD Athlon(tm) 64 Processor 3200+
stepping        : 0
cpu MHz         : 2002.893
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext fxsr_opt lm 3dnowext 3dnow up lahf_lm
bogomips        : 4007.69
clflush size    : 64
cache_alignment : 64
address sizes   : 40 bits physical, 48 bits virtual
power management: ts fid vid ttp

论坛徽章:
2
技术图书徽章
日期:2013-09-04 15:21:51酉鸡
日期:2013-11-01 21:20:20
13 [报告]
发表于 2010-05-31 15:57 |只看该作者
用户层是没法获取到实时高精度时间的吧?

论坛徽章:
0
14 [报告]
发表于 2010-05-31 17:56 |只看该作者
回复 13# mirnshi


    我在想,不会别人写驱动也无法获得1ms的定时吧

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
15 [报告]
发表于 2010-05-31 18:09 |只看该作者
这个跟OS 的最小时间片间隔有关系吧

论坛徽章:
0
16 [报告]
发表于 2010-05-31 20:08 |只看该作者
精度和编译内核的参数也有关系

论坛徽章:
1
寅虎
日期:2014-11-30 21:25:54
17 [报告]
发表于 2010-05-31 20:15 |只看该作者
回复 12# 没本


    rdtsc这个东西在多核下问题很严重  看陈硕的一篇文章

定时器这东西看他要用户级的还是系统级的 用户级的不可避免要大量占用CPU

论坛徽章:
0
18 [报告]
发表于 2010-05-31 22:14 |只看该作者
回复 1# my1919_2005


  记忆中hp-ux有个补丁,支持毫秒以下的精度。

论坛徽章:
0
19 [报告]
发表于 2010-05-31 23:14 |只看该作者
回复 18# seer671


    这位兄弟,太谢谢了,我查了一下hpunix的 手册,它设定系统默认的时间精度是10ms,因此你不管调用什么api都是不可能得到比这个还精确地数字了,系统本身有一个hires_timeout_enable参数必须设置成1,才能得到精度更高的时间周期

论坛徽章:
0
20 [报告]
发表于 2010-06-01 08:23 |只看该作者
/*********************************************************************************/

设置hires_timeout_enable之前
/*********************************************************************************/
function                  time(usec)    realTime      reduce
---------------------------------------------------------------------
usleep                        500000      516497       16497
nanosleep                     500000      509710        9710
select                        500000      509819        9819
pthread_cond_timedwait        500000      509816        9816
usleep                        100000      109857        9857
nanosleep                     100000      109765        9765
select                        100000      109810        9810
pthread_cond_timedwait        100000      109854        9854
usleep                         50000       59873        9873
nanosleep                      50000       59767        9767
select                         50000       59807        9807
pthread_cond_timedwait         50000       59858        9858
usleep                         10000       19842        9842
nanosleep                      10000       19733        9733
select                         10000       19808        9808
pthread_cond_timedwait         10000       19856        9856
usleep                          1000       19846       18846
nanosleep                       1000       19758       18758
select                          1000        9816        8816
pthread_cond_timedwait          1000       19857       18857
usleep                           900       19869       18969
nanosleep                        900       19945       19045
select                           900        9618        8718
pthread_cond_timedwait           900       19854       18954
usleep                           500       19848       19348
nanosleep                        500       19758       19258
select                           500        9910        9410
pthread_cond_timedwait           500       19779       19279
usleep                           100       19835       19735
nanosleep                        100       19758       19658
select                           100        9825        9725
pthread_cond_timedwait           100       19851       19751
usleep                            10       19854       19844
nanosleep                         10       19748       19738
select                            10        9862        9852
pthread_cond_timedwait            10       20024       20014
usleep                             1       19642       19641
nanosleep                          1       19797       19796
select                             1        9782        9781
pthread_cond_timedwait             1          10           9
/*********************************************************************************/
可见HP-UX定时器时间精度大概在10ms左右


设置hires_timeout_enable之后
/*********************************************************************************/
function                  time(usec)    realTime      reduce
---------------------------------------------------------------------
usleep                        500000      500121         121
nanosleep                     500000      500024          24
select                        500000      511024       11024
pthread_cond_timedwait        500000      500083          83
usleep                        100000      100093          93
nanosleep                     100000      100030          30
select                        100000      109039        9039
pthread_cond_timedwait        100000      100057          57
usleep                         50000       50073          73
nanosleep                      50000       50018          18
select                         50000       59141        9141
pthread_cond_timedwait         50000       50038          38
usleep                         10000       10105         105
nanosleep                      10000       10023          23
select                         10000       19047        9047
pthread_cond_timedwait         10000       10052          52
usleep                          1000        1083          83
nanosleep                       1000        1026          26
select                          1000       17207       16207
pthread_cond_timedwait          1000        1111         111
usleep                           900         984          84
nanosleep                        900         922          22
select                           900       16120       15220
pthread_cond_timedwait           900         977          77
usleep                           500         592          92
nanosleep                        500         529          29
select                           500       17159       16659
pthread_cond_timedwait           500         587          87
usleep                           100         205         105
nanosleep                        100         124          24
select                           100        8350        8250
pthread_cond_timedwait           100         188          88
usleep                            10         173         163
nanosleep                         10         130         120
select                            10        8757        8747
pthread_cond_timedwait            10         205         195
usleep                             1         155         154
nanosleep                          1         125         124
select                             1        8805        8804
pthread_cond_timedwait             1          23          22
/*********************************************************************************/
除了select保持在10ms左右,其他api精度提高到200us以内。和hp的手册说的一致。

      hires_timeout_enable is a dynamic tunable that enables/disables
      support for high resolution timers and timed sleep for the following
      Application Programming Interfaces (APIs) - nanosleep, getitimer,
      setitimer, sigtimedwait, timer_gettime, timer_settime, ualarm, usleep,
      and pthread_cond_timedwait.  With the higher resolution, these
      interfaces can be expected to support time intervals less than the
      current 10 ms.
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP