C++ 在clock_gettime()中使用_粗略变量仍会调用sys_clock_gettime()系统调用

C++ 在clock_gettime()中使用_粗略变量仍会调用sys_clock_gettime()系统调用,c++,linux,performance,time,profiling,C++,Linux,Performance,Time,Profiling,我一直在使用clock_gettime函数,将clock_MONOTONIC_Rough作为我代码中的第一个参数,如下所示: struct timespec tmptv; clock_gettime(CLOCK_MONOTONIC_COARSE, &tmptv); 然而,当我在代码上运行gperftools cpu profiler时,对_sys_clock_gettime的调用比例相对较高,约为8.6% 我用CLOCK_getres()函数检查了我对CLOCK_MON

我一直在使用clock_gettime函数,将clock_MONOTONIC_Rough作为我代码中的第一个参数,如下所示:

    struct timespec tmptv;
    clock_gettime(CLOCK_MONOTONIC_COARSE, &tmptv);
然而,当我在代码上运行gperftools cpu profiler时,对_sys_clock_gettime的调用比例相对较高,约为8.6%

我用CLOCK_getres()函数检查了我对CLOCK_MONOTONIC_rough的使用,它显示了4000000纳秒的分辨率,我认为这是1毫秒的正确数量级

除了time.h之外,我是否应该在代码中包含另一个库,以便在不进行系统调用的情况下使用CLOCK\u MONOTONIC\u rough?我希望避免这种低效


谢谢

如果此修补程序可用,则它看起来仍然应该是一个系统调用:

它只是不调用特定的函数来从某些硬件寄存器获取准确的时间,至少在某些硬件上,这相当慢

但有很多因素:

它是什么硬件
clock_gettime()
应该是x86和x86-64上的虚拟系统调用[vsyscall]

最后,如果你在很多函数调用中把它称为“第一个参数”,那么很可能就是它所花费的时间

我怀疑是否有任何方法可以在不调用虚拟系统的情况下获取当前时间,因为您确实需要从内核获取一些信息来获取当前时间——如果它不调用内核代码,那么它应该从哪里找到当前时间


虚拟系统调用的工作原理是向用户空间添加一点“内核代码”,用户空间对内核内存空间的某些部分具有只读访问权限,特别是“当前进程ID”和“父进程ID”以及某些类型的时间信息,如我认为的“当前时间”和“CPU使用情况统计”。这允许系统调用完全在用户空间中完成,因此比转换到内核模式并再次退出的“真实”系统调用快得多。

对于感兴趣的人,以下是所有这些时钟id的计时

在corei7 gen7内核4.4 64位上进行测量

以100为刻度表示最快:

 100: CLOCK_REALTIME_COARSE and CLOCK_MONOTONIC_COARSE
 410: CLOCK_REALTIME and CLOCK_MONOTONIC
5530: CLOCK_BOOTTIME
6630: CLOCK_PROCESS_CPUTIME_ID and CLOCK_THREAD_CPUTIME_ID
所以我假设,在内核4.4中,时钟实时、时钟单调以及它们的粗略变体都使用vdso。time-v显示的系统时间为零,所有时间都花费在用户空间中,这一事实证实了这一点。粗变量只是以牺牲精度为代价的优化

另一个时钟id可能不使用vdso,而是执行真正的系统调用。系统时间占总时间的很大一部分,这一事实证实了这一点


当然,如果vdso中实现了更多的时钟id,那么后续内核中的时钟id可能会有所不同。

嗨,我明白了,这是有道理的。我在一台x86-64机器上工作,因此我设想,带有clock_单调的clock_gettime()和带有clock_单调粗糙的clock_gettime()都在我的机器上执行虚拟系统调用,因此当我从clock_单调粗糙切换到clock_单调粗糙时,CPU使用率没有减少。