相关疑难解决方法(0)

如何测量C中的时间间隔?

我想用C测量时间,我很难搞清楚,我想要的是这样的:

  • 启动计时器
  • 运行一个方法
  • 停止计时器
  • 报告所花费的时间(至少达到微观准确度)

任何帮助,将不胜感激.

(我使用mingw在windows中编译)

c timer

46
推荐指数
2
解决办法
13万
查看次数

为什么clock_gettime如此不稳定?

介绍

  • 章节旧问题包含初始问题(此后已添加进一步调查结论).

  • 跳到部分进一步调查下面的不同的定时的方法(详细比较rdtsc,clock_gettimeQueryThreadCycleTime).

  • 我相信CGT的不稳定行为可归因于有缺陷的内核或有缺陷的CPU(参见结论部分).

  • 用于测试的代码位于此问题的底部(请参阅附录部分).

  • 道歉的长度.


老问题

简而言之:我clock_gettime用来衡量许多代码段的执行时间.我在单独的运行之间经历了非常不一致的测量.与其他方法相比,该方法具有极高的标准偏差(参见下面的说明).

问题:clock_gettime与其他方法相比,有没有理由给出如此不一致的测量结果?是否有一种替代方法具有相同的分辨率来解决线程空闲时间?

说明:我正在尝试分析C代码的一些小部分.每个代码段的执行时间不超过几微秒.在单次运行中,每个代码段将执行数百次,从而产生runs × hundreds测量值.

我还必须只测量线程实际执行的时间(这就是为什么rdtsc不适合).我还需要一个高分辨率(这就是为什么times不适合).

我尝试了以下方法:

  • rdtsc (在Linux和Windows上),

  • clock_gettime (在Linux上使用'CLOCK_THREAD_CPUTIME_ID';)和

  • QueryThreadCycleTime (在Windows上).

方法:分析在25次运行中进行.在每次运行中,单独的代码段重复101次.因此我有2525次测量.然后我查看测量的直方图,并计算一些基本的东西(如平均值,std.dev.,中位数,模式,最小值和最大值).

我没有介绍我如何测量三种方法的"相似性",但这仅仅涉及对每个代码段花费的时间比例的基本比较("比例"意味着时间被标准化).然后我看看这些比例的纯粹差异.这种比较表明,在25次运行中平均所有'rdtsc','QTCT'和'CGT'的比例相同.但是,下面的结果表明'CGT'具有非常大的标准偏差.这使得它在我的用例中无法使用.

结果:

的比较clock_gettimerdtsc对于相同的代码段(101个测量= 2525个读数25次运行):

  • clock_gettime:

    • 1881测量11 ns,
    • 595次测量(几乎正常分布)在3369和3414 ns之间,
    • 2次测量11680 ns,
    • 1测量1506022 ns,和
    • 其余的在900到5000 ns之间.

    • 最小值:11 ns

    • 最大值:1506022 ns
    • 平均值:1471.862 ns …

linux time profiling

34
推荐指数
1
解决办法
1万
查看次数

更快相当于gettimeofday

在尝试构建一个对延迟敏感的应用程序时,需要每秒发送100条消息,每条消息都有时间字段,我们要考虑优化gettimeofday.首先想到的是rdtsc基于优化.有什么想法吗 ?还有其他指针吗?返回的时间值所需的准确度以毫秒为单位,但如果该值偶尔与接收器不同步1-2毫秒,则不是很大.试图比62纳秒的gettimeofday做得更好

c optimization clock gettimeofday

25
推荐指数
3
解决办法
3万
查看次数

如何获得linux gettimeofday()的微秒时间以及它的准确性是多少?

挂钟时间通常由系统RTC提供.这主要仅提供低至毫秒范围的时间,并且通常具有10-20毫秒的粒度.但是,gettimeofday()的分辨率/粒度通常报告在几微秒范围内.我假设微秒粒度必须来自不同的来源.

gettimeofday()的微秒分辨率/粒度是如何完成的?

当从RTC获取毫微秒的部分并且从不同的硬件获取微秒时,出现了两个源的定相问题.这两个来源必须以synchronized某种方式.

这两个来源之间的同步/阶段是如何完成的?

编辑:从我在amdn提供的链接中看到的,特别是以下的英特尔链接,我在这里添加一个问题:

是否gettimeofday()在微秒制度中提供分辨率/粒度?


编辑2:总结amdns 答案以及更多阅读结果:

Linux仅在启动时使用实时时钟(RTC)与更高分辨率的计数器同步,即Timestampcounter(TSC).引导后gettimeofday()返回一个完全基于TSC值和该计数器频率的时间.frequency通过将系统时间与外部时间源进行比较来校正/校准TSC的初始值.调整由adjtimex()函数完成/配置.内核运行锁相环以确保时间结果是单调且一致的.

这样可以说gettimeofday()具有微秒分辨率.考虑到更现代的Timestampcounter在GHz体系中运行,可获得的分辨率可能在纳秒范围内.因此这个有意义的评论

/**
407  * do_gettimeofday - Returns the time of day in a timeval
408  * @tv:         pointer to the timeval to be set
409  *
410  * NOTE: Users should be converted to using getnstimeofday()
411  */
Run Code Online (Sandbox Code Playgroud)

可以在Linux/kernel/time/timekeeping.c中找到.这表明在稍后的时间点可能存在更高分辨率的功能.现在getnstimeofday()只在内核空间中可用.

但是,查看所有涉及的代码以获得正确的信息,显示了很多关于不确定性的评论.有可能获得微秒分辨率.该功能gettimeofday()甚至可以在微秒方案中显示粒度.但是:由于driftTSC频率无法准确校正,因此对其准确性有严重的考虑.此外,在Linux中处理这个问题的代码的复杂性暗示着相信它实际上很难做到正确.这是特别的,但不仅仅是由Linux应该运行的大量硬件平台引起的.

结果: …

linux time linux-kernel

23
推荐指数
1
解决办法
1万
查看次数

我在 Linux 上可以获得的最佳时序分辨率是多少

我正在尝试测量并行端口上 2 个信号之间的时间差,但首先我要知道我的测量系统(AMD Athlon(tm) 64 X2 双核处理器 5200+ \xc3\x97 2) 在 SUSE 12.1 x64 上。

\n\n

因此,经过一番阅读后,我决定使用clock_gettime(),首先我使用以下代码获取clock_getres()值:

\n\n
/*\n * This program prints out the clock resolution.\n */\n#include <stdio.h>\n#include <stdlib.h>\n#include <time.h>\n\nint main( void )\n  {\n    struct timespec res;\n\n    if ( clock_getres( CLOCK_REALTIME, &res) == -1 ) {\n      perror( "clock get resolution" );\n      return EXIT_FAILURE;\n    }\n    printf( "Resolution is %ld nano seconds.\\n",\n          res.tv_nsec);\n    return EXIT_SUCCESS;\n  }\n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是:1 纳秒。我很高兴!

\n\n

但这是我的问题,当我尝试用其他代码检查这一事实时:

\n\n
#include <iostream>\n#include <time.h>\nusing namespace std;\n\ntimespec diff(timespec start, timespec end);\n\nint …
Run Code Online (Sandbox Code Playgroud)

c++ resolution timing

2
推荐指数
1
解决办法
9506
查看次数