- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图通过使用物理时钟来测量c++中某些命令的执行时间,但是我遇到了一个问题,即从计算机上的物理时钟读取测量值的过程可能会花费很长时间。这是代码:
#include <string>
#include <cstdlib>
#include <iostream>
#include <math.h>
#include <time.h>
int main()
{
int64_t mtime, mtime2, m_TSsum, m_TSssum, m_TSnum, m_TSmax;
struct timespec t0;
struct timespec t1;
int i,j;
for(j=0;j<10;j++){
m_TSnum=0;m_TSsum=0; m_TSssum=0; m_TSmax=0;
for( i=0; i<10000000; i++) {
clock_gettime(CLOCK_REALTIME,&t0);
clock_gettime(CLOCK_REALTIME,&t1);
mtime = (t0.tv_sec * 1000000000LL + t0.tv_nsec);
mtime2= (t1.tv_sec * 1000000000LL + t1.tv_nsec);
m_TSsum += (mtime2-mtime);
m_TSssum += (mtime2-mtime)*(mtime2-mtime);
if( (mtime2-mtime)> m_TSmax ) { m_TSmax = (mtime2-mtime);}
m_TSnum++;
}
std::cout << "Average "<< (double)(m_TSsum)/m_TSnum
<< " +/- " << floor(sqrt( (m_TSssum/m_TSnum - ( m_TSsum/m_TSnum ) *( m_TSsum/m_TSnum ) ) ) )
<< " ("<< m_TSmax <<")" <<std::endl;
}
}
$ taskset -c 20 ./a.out
Average 18.0864 +/- 10 (17821)
Average 18.0807 +/- 8 (9116)
Average 18.0802 +/- 8 (8107)
Average 18.078 +/- 6 (7135)
Average 18.0834 +/- 9 (21240)
Average 18.0827 +/- 8 (7900)
Average 18.0822 +/- 8 (9079)
Average 18.086 +/- 8 (8840)
Average 18.0771 +/- 6 (5992)
Average 18.0894 +/- 10 (15625)
clock_gettime()
大约需要18纳秒(在此特定服务器上),但是我不明白为什么“最长”时间似乎要长300到1000倍?
最佳答案
为什么是离群值?
有许多与软件和硬件相关的原因,当您在两个clock_gettime
调用中迭代1000万次时,可能会看到异常事件(和非异常变化)。这些原因包括:
watch -n1 cat /proc/interrupts
,看看您可能认为是空闲的系统如何进行操作。 clock_gettime
的内部结构,则很可能会发现某些分支,这些分支在发生某些溢出或在VDSO竞赛的调整因子中进行读取并进行更新等时,采取不同的路径。/sys/devices/system/cpu/intel_pstate/no_turbo
驱动程序,则可以通过将0
设置为intel_pstate
来禁用 super 名词(又名Turbo)。如果您有其他驱动程序,也可以操作Turbo模式directly via MSR;如果其他所有驱动程序都失败,则可以在BIOS中进行操作。在linked question中,禁用turbo时,异常值基本上消失了,因此首先要尝试一下。/proc/interrupts
),并查看该计数足以解释异常值。如果您发现计时器中断是具体原因,则可以探索内核提供的各种“tickless”(也称为“NOHZ”)模式来减少或消除它们。您也可以通过x86上的HW_INTERRUPTS.RECEIVED
性能计数器直接对它们进行计数。HZ
速率(在现代内核中通常为250/秒)发生-但在大多数情况下很少见调度程序实际上决定在您繁忙的CPU上调度另一个进程的空闲系统。如果使基准测试循环更短,则通常几乎可以完全避免上下文切换。perf
等各种配置工具来检查这种情况是否正在发生。您可以仔细设计数据包处理代码的核心,例如通过预先触摸缓存行来避免诸如缓存未命中之类的异常事件,并且可以避免使用复杂性未知的系统调用。if( (mtime2-mtime)> m_TSmax )
条件的情况下-但这应该很少(也许您的编译器使其变为无分支的,在这种情况下,只有一条执行路径)。
关于c++ - 为什么反复调用clock_gettime时会看到400倍的异常时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49200725/
我有一个小心理障碍:我有一个 html 中的 javascript 函数,可以在按下某个键时写入键码。我已经将它连接到一个函数,该函数可以准确地告诉我按下了什么字符和键码(不包括在内)。 我的问题是如
我上网已经有一段时间了,现在正试图解决这个问题。可以找到正在发生的事情的视频: https://i.gyazo.com/59fc489b6099b513c41aedeed482b8d2.mp4 $(d
我有一个 Python 程序,其中一个函数导入另一个脚本并运行它。但是脚本仅在第一次函数被调用时运行。 def Open_Generator(事件): 导入密码生成器 有什么建议吗? *该函数在 tk
我正在尝试在 git 中创建两个包含二进制文件的分支 - 一个“开发”分支和一个“稳定”分支。在我想将它们“发布”到稳定分支之前,开发分支可以对这些文件进行一些更改(并且稳定分支已重命名这些文件,以防
我在 IBM BlueMix 中的 Node Red 应用程序反复崩溃 - 每小时一次 - 除了“exited with status: 1.”之外没有任何真正的错误消息 如何解决此问题? 是否有来自
我是一名优秀的程序员,十分优秀!