c++ - 在 clock_gettime() 中使用 _COARSE 变体仍然调用 sys_clock_gettime() 系统调用

标签 c++ linux performance time profiling

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

    struct timespec tmptv;
    clock_gettime(CLOCK_MONOTONIC_COARSE, &tmptv);

但是,当我在我的代码上运行 gperftools cpu profiler 时,我得到了相对较高比例的 __sys_clock_gettime 调用,大约为 8.6%。

我检查了我对 CLOCK_MONOTONIC_COARSE 和 clock_getres() 函数的使用情况,它揭示了 4000000 ns 的分辨率,我认为这是 1 ms 的正确数量级。

除了 time.h 之外,我是否应该在我的代码中包含另一个库,让我在不进行系统调用的情况下使用 CLOCK_MONOTONIC_COARSE?我想避免这种低效率。

谢谢!

最佳答案

看起来它应该仍然是一个系统调用,如果这个补丁有任何意义的话: http://lwn.net/Articles/342018/

它只是不调用特定函数来从某些硬件寄存器中获取精确时间,这至少在某些硬件上非常慢。

但是有很多因素:

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

最后,如果您在很多函数调用中将其称为“第一个参数”,那么它很可能只是花费了多少时间。

我怀疑是否有任何方法可以在至少没有虚拟系统调用的情况下获取当前时间,因为您确实需要来自内核的一些信息来获取当前时间 - 如果没有,应该从哪里找到当前时间' 对内核代码进行某种调用。

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

关于c++ - 在 clock_gettime() 中使用 _COARSE 变体仍然调用 sys_clock_gettime() 系统调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25211241/

相关文章:

c++ - 更快地标准化下三角矩阵

c++ - 有没有好的 C++ 后缀 Trie 库?

c++ - 在没有忙等待的情况下等待多个信号量(C/C++ Linux)

java - Java 中 StringTokenizer 类与 String.split 方法的性能对比

c++ - 字符串和字符串数组的零初始化(C++)

java - jstatd.all.policy放置在哪里

linux - 如何在 linux c 上添加 dir.h 库

C - System V - 删除共享内存段

mysql - EXISTS vs IN - 哪一个在MySQL 5.5和MySQL 5.7中更好?

mysql - 我是否需要一个针对具有 20 多个属性的模型的搜索引擎