你能解释一下Linux上返回的时钟CLOCK_REALTIME和CLOCK_MONOTONIC时钟之间的区别clock_gettime()吗?
如果我需要计算外部源产生的时间戳与当前时间之间的经过时间,那么哪个是更好的选择?
最后,如果我有一个NTP守护进程周期性地调整系统时间,如何做这些调整与每个交互CLOCK_REALTIME和CLOCK_MONOTONIC?
仅使用ANSI C,有没有办法以毫秒或更多精度测量时间?我正在浏览time.h但我只发现了第二个精确功能.
std::system_clock和之间有什么区别std::steady_clock?(说明不同结果/行为的示例案例会很棒).
如果我的目标是精确测量的功能(如基准)的执行时间,这将是之间是最好的选择std::system_clock,std::steady_clock和std::high_resolution_clock?
根据Ubuntu下的Linux手册页
CLOCK_MONOTONIC
Clock that cannot be set and represents monotonic time since
some unspecified starting point.
CLOCK_MONOTONIC_RAW (since Linux 2.6.28; Linux-specific)
Similar to CLOCK_MONOTONIC, but provides access to a raw hard?
ware-based time that is not subject to NTP adjustments.
Run Code Online (Sandbox Code Playgroud)
根据韦伯斯特在线词典Monotonic的意思是:
2:随着独立变量的值或术语的下标的增加,具有永不增加或永不减少的属性.
换句话说,它不会向后跳.我可以看到,如果你计算一些代码,这将是一个重要的属性.
但是,正常版本和原始版本之间的差异尚不清楚.有人可以了解一下NTP如何影响CLOCK_MONOTONIC?
嗨,我想使用该clock_gettime()函数来测量我的代码的性能.
我无法理解手册页描述中函数中使用的各种时钟之间的区别.ESP
CLOCK_REALTIME,
CLOCK_PROCESS_CPUTIME_ID
CLOCK_THREAD_CPUTIME_ID
Run Code Online (Sandbox Code Playgroud)
有人可以解释每个钟表的作用吗?
完全重写/更新为了清晰(和你的理智,它的长期太长)...(旧帖子)
对于赋值,我需要找到每个缓存的级别(L1,L2,...)和大小.给出提示和我到目前为止所发现的内容:我认为这个想法是创建不同大小的数组并阅读它们.计时这些操作:
sizes = [1k, 4k, 256K, ...]
foreach size in sizes
create array of `size`
start timer
for i = 0 to n // just keep accessing array
arr[(i * 16) % arr.length]++ // i * 16 supposed to modify every cache line ... see link
record/print time
Run Code Online (Sandbox Code Playgroud)
更新(9月28日下午6:57 UTC + 8)
另见完整来源
好了,现在按照@ mah的建议,我可能已经修复了SNR比率问题......还找到了一种计算代码的方法(wall_clock_time来自实验室示例代码)
但是,我似乎得到了不正确的结果:我在英特尔酷睿i3 2100上:[ SPECS ]
我得到的结果,在图表中:
lengthMod:1KB到512K

第一峰的基数是32K ......合理......第二个是384K ......为什么?我期待256?
lengthMod:512k到4MB

那为什么这个范围会变得一团糟? …
我知道这个问题可能以前经常被问过,但似乎大多数问题都是关于一段代码的经过时间(基于挂钟).一段代码的经过时间不太可能等于实际执行时间,因为其他进程可能在感兴趣的代码的经过时间期间执行.
我使用getrusage()来获取进程的用户时间和系统时间,然后通过(用户时间+系统时间)计算实际执行时间.我在Ubuntu上运行我的程序.这是我的问题:
在阅读了这篇关于经过时间的文章之后,我写了一个简单的代码来计算循环的执行时间:
#include <stdio.h>
#include <sys/time.h>
int main (int argc, char** argv) {
struct timeval, tvalBefore, tvalAfter;
gettimeofday (&tvalBefore, NULL);
int i =0;
while ( i < 1000) {
i ++;
}
gettimeofday (&tvalAfter, NULL);
printf("Time in microseconds: %0.3f microseconds\n",
(float)(tvalAfter.tv_sec - tvalBefore.tv_sec)
)
return 0;
}
Run Code Online (Sandbox Code Playgroud)
clang编译器给我以下错误:
print_time.c:7:16: error: expected identifier or '('
struct timeval, *tvalBefore, *tvalAfter;
^
print_time.c:13:17: error: use of undeclared identifier 'tvalBefore'
gettimeofday (&tvalBefore, NULL);
^
print_time.c:19:17: error: use of undeclared identifier 'tvalAfter' …Run Code Online (Sandbox Code Playgroud) clock_gettime(CLOCK_MONOTONIC, ...) 可用于Linux而不是OS X.Mach计时器可在OS X中使用,但在Linux中不可用.
如何在C中获得ns精度单调时钟,这在Linux和OS X上都有效?
一个简单的问题:你time(...)和clock_gettime( CLOCK_REALTIME, ... )(仅就秒),理论上产生相同的时间?
这就是我的意思:
time_t epoch;
time( &epoch );
Run Code Online (Sandbox Code Playgroud)
和
struct timespec spec;
clock_gettime( CLOCK_REALTIME, &spec );
Run Code Online (Sandbox Code Playgroud)
这两个应该返回完全相同的结果(相对于秒)?
我通过改变时间和时区来"测试"这个epoch并且spec.tv_sec总是显示相同的结果,但是文档CLOCK_REATIME让我感到困惑,我不确定,它们将始终是相同的.
现实世界的情况:我有一段代码,它使用time.现在我想要以毫秒为单位的时间(可以取spec.tv_nsec,乘以1000000).所以我考虑time直接删除和使用clock_gettime,但我不确定在所有情况下这是否会保持不变.
这个问题在某种程度上与Linux中的测量时间有关- 时间与时间对比getrusage vs clock_gettime vs gettimeofday vs timespec_get?但那里的信息对我来说还不够......我想.
为了测量C中的函数的执行时间,如何准确的是POSIX函数gettimeofday()中的Ubuntu 12.04上的英特尔酷睿i7?为什么?如果很难说,那该怎么找出来?我找不到直接的答案.
正如已经有一段时间所知(例如,参见这个老问题,以及当你谷歌这个时弹出的错误报告),clock_gettime()似乎不会单调地报告时间.为了排除我可能监督的任何愚蠢错误,这里是相关代码(摘自大型程序):
<include time.h>
long nano_1, nano_2;
double delta;
struct timespec tspec, *tspec_ptr;
clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr);
nano_1 = tspec.tv_nsec;
sort_selection(sorted_ptr, n);
clock_gettime(CLOCK_MONOTONIC_RAW, tspec_ptr);
nano_2 = tspec.tv_nsec;
delta = (nano_2 - nano_1)/1000000.0;
printf("\nSelection sort took %g micro seconds.\n", (double) delta);
Run Code Online (Sandbox Code Playgroud)
对小阵列(大约1,000个元素)进行排序会报告合理的时间.当我使用3种排序算法对较大的(10,000+)进行排序时,3个中的1-2个报告返回负排序时间.我尝试了手册页中提到的所有时钟类型,而不仅仅是CLOCK_MONOTONIC_RAW - 没有变化.
(1)我在代码中忽略了什么?
(2)是否有替代clock_gettime()的方法,以递增的方式测量时间比秒更精确?我不需要nanonseconds,但秒太粗糙,无法真正帮助.
系统:
- Ubuntu 12.04.
- 内核3.2.0-30
- gcc 4.6.3.
- libc version 2.15
- 使用-lrt编译
为了计算 ac 程序所花费的总时间,我们通常使用头文件中的函数 asclock()和。
测量CPU 已使用的滴答数 ( ),之后我们可以轻松地将我们希望计算的代码片段的起始点和结束点之间的差异除以。这有助于我们获取以秒为单位的时间
,还返回自特定时间点以来的整秒数。这里提到现在这是我的问题。为了计算一个正常的c程序所花费的总时间(以记录加速操作),当使用运行时,我利用系统中存在的所有处理器,计算所花费时间的最佳方法是什么。因为只会返回在每个处理器上运行程序所花费的累积时间,基本上,time() 是一种非常模糊的计算方法,因为我对以毫秒为单位的时间计算感兴趣。time()<time.h>clock()CLOCKS_PER_SECCLOCKS_PER_SECtime(null)
OpenMPclock()(actual_time_taken x omp_get_max_threads())