免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 19701 | 回复: 11
打印 上一主题 下一主题

linux下不受修改系统时间影响的接近毫秒级的GetTickCount如何实现? [复制链接]

论坛徽章:
9
摩羯座
日期:2013-08-15 15:18:48狮子座
日期:2013-09-12 18:07:47金牛座
日期:2013-09-16 13:23:09辰龙
日期:2013-10-09 09:03:27白羊座
日期:2013-10-17 13:32:44子鼠
日期:2014-04-23 15:09:38戌狗
日期:2014-09-17 11:37:542015年亚洲杯之韩国
日期:2015-03-26 10:16:442015亚冠之武里南联
日期:2015-08-18 14:55:52
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-09-15 14:39 |只看该作者 |倒序浏览
在man查询times,可以得知times的返回值是当前所经历的tick数,而sysconf(_SC_CLK_TCK)所返回的是1秒钟会经过的tick数。
根据此原理,设计以下代码,我在多核实机上测试过没有问题,休眠5秒后所打印的past tick是5000,其中tps打印的结果是100。
而在windows实机,linux虚拟机上,虽然tps也是100,但是past tick却只有3320左右(另外一台实机的虚拟机只有2680左右)。
貌似这个方法还是不能很好的工作,请问有替代方法否?(gettimeofday会被修改系统时间影响,因此不适合,排除)

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/times.h>

  5. unsigned long GetTickCount()
  6. {
  7.         static unsigned long s_mode = 0;
  8.         static unsigned long s_tt = 0;
  9.         if (s_mode == 0)
  10.         {
  11.                 unsigned long tps = (unsigned long)sysconf(_SC_CLK_TCK);
  12.                 printf("tps = %lu\r\n", tps);
  13.                 if (1000 % tps == 0)
  14.                 {
  15.                         s_tt = 1000 / tps;
  16.                         s_mode = 1;
  17.                 }
  18.                 else
  19.                 {
  20.                         s_tt = tps;
  21.                         s_mode = 2;
  22.                 }
  23.         }
  24.         struct tms t;
  25.         const unsigned long dw = (unsigned long)times(&t);
  26.         return (s_mode == 1 ? (dw * s_tt) : (unsigned long)(dw * 1000LL / s_tt));
  27. }

  28. int main(int, char**)
  29. {
  30.         unsigned long u1 = GetTickCount();
  31.         printf("begin tick = %lu\r\n", u1);
  32.         sleep(5);
  33.         unsigned long u2 = GetTickCount();
  34.         printf("end tick = %lu\r\npast tick = %lu\r\n", u2, u2 - u1);
  35.         return 0;
  36. }
复制代码

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
2 [报告]
发表于 2011-09-15 15:03 |只看该作者
这个函数据我所知获取的是执行时间, 也就是睡眠时间是不计算在内的。。。。。。
这个问题也困扰着我, 现在我的办法是自己做了一个高优先级线程自己通过nanosleep计时, 虽然不精确, 于我的具体应用已经够了。

也想着有什么好方法没有

论坛徽章:
2
青铜圣斗士
日期:2015-11-26 06:15:59数据库技术版块每日发帖之星
日期:2016-07-24 06:20:00
3 [报告]
发表于 2011-09-15 15:05 |只看该作者

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
4 [报告]
发表于 2011-09-15 15:21 |只看该作者
?
OwnWaterloo 发表于 2011-09-15 15:05



请教一下 rdtsc 的精度, 以前也记得看到过, 后来忘记了; 你这一提, 我又记起来了, 有没有arms上的类似东西, 因为我的是跑在arms上的

论坛徽章:
0
5 [报告]
发表于 2011-09-15 15:23 |只看该作者
clock_gettime(CLOCK_MONOTONIC, ...

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
6 [报告]
发表于 2011-09-15 15:25 |只看该作者
clock_gettime(CLOCK_MONOTONIC, ...
sunmoon1997 发表于 2011-09-15 15:23


哎, 我的是 freebsd 系的。。。。。。。。。。。。

论坛徽章:
0
7 [报告]
发表于 2011-09-15 15:34 |只看该作者
#define _POSIX_C_SOURCE 199309
#include <time.h>
int clock_gettime(clockid_t clockid, struct timespec *tp);

CLOCK_MONOTONIC: Nonsettable monotonic clock

SUSv3 specifies that the CLOCK_MONOTONIC clock measures time since some
“unspecified point in the past” that doesn’t change after system startup. This clock
is useful for applications that must not be affected by discontinuous changes to the
system clock (e.g., a manual change to the system time). On Linux, this clock measures
the time since system startup.

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
8 [报告]
发表于 2011-09-15 15:40 |只看该作者
本帖最后由 zylthinking 于 2011-09-15 15:51 编辑

谢谢, 可惜:

Undefined symbols for architecture armv6:
  "_clock_gettime", referenced from:
      _exceptionHandler in main.o
ld: symbol(s) not found for architecture armv6
clang: error: linker command failed with exit code 1 (use -v to see invocation)

妈的比freebsd还要更有限制一点, 狗日的是 ios.

晕, 看错了, 登到 ubuntu 上去看头文件了.  mac 上也没有这个函数; freebsd上倒有

论坛徽章:
0
9 [报告]
发表于 2011-09-15 15:55 |只看该作者
iOS 可以用 mach_absolute_time()

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2011-09-15 16:11 |只看该作者
本帖最后由 zylthinking 于 2011-09-15 17:23 编辑

我查了一下, 没找到明确结论, 但mach_absolute_time 这个 absolute...... 不受修改系统时钟影响么

thanks, 严正了一吧, 完全满足我的需求
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP