我想用C测量时间,我很难搞清楚,我想要的是这样的:
任何帮助,将不胜感激.
(我使用mingw在windows中编译)
章节旧问题包含初始问题(此后已添加进一步调查和结论).
跳到部分进一步调查下面的不同的定时的方法(详细比较rdtsc,clock_gettime和QueryThreadCycleTime).
我相信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_gettime与rdtsc对于相同的代码段(101个测量= 2525个读数25次运行):
clock_gettime:
其余的在900到5000 ns之间.
最小值:11 ns
在尝试构建一个对延迟敏感的应用程序时,需要每秒发送100条消息,每条消息都有时间字段,我们要考虑优化gettimeofday.首先想到的是rdtsc基于优化.有什么想法吗 ?还有其他指针吗?返回的时间值所需的准确度以毫秒为单位,但如果该值偶尔与接收器不同步1-2毫秒,则不是很大.试图比62纳秒的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应该运行的大量硬件平台引起的.
结果: …
我正在尝试测量并行端口上 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 }\nRun 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 ×2
linux ×2
time ×2
c++ ×1
clock ×1
gettimeofday ×1
linux-kernel ×1
optimization ×1
profiling ×1
resolution ×1
timer ×1
timing ×1