Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/.htaccess/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux时间和性能时钟在代码中的差异 我正在运行一些C++代码的定时测试,我发现了一个我不是100%的工件。_Linux_C++11_Timing - Fatal编程技术网

Linux时间和性能时钟在代码中的差异 我正在运行一些C++代码的定时测试,我发现了一个我不是100%的工件。

Linux时间和性能时钟在代码中的差异 我正在运行一些C++代码的定时测试,我发现了一个我不是100%的工件。,linux,c++11,timing,Linux,C++11,Timing,设置 我的代码使用C++11高分辨率时钟来测量经过的时间。我还使用Linux的time命令(/usr/bin/time)包装程序的执行。对于我的程序,高分辨率时钟报告2秒,而时间报告7秒(~6.5s用户和~0.5s系统)。另外,在time上使用verbose选项表明,我的程序使用了100%的CPU,其中有1个自愿性上下文切换和10个自愿性上下文切换(/usr/bin/time-v) 问题 我的问题是,是什么导致操作系统时间度量和性能时间度量之间存在如此巨大的差异 我最初的想法 根据我对操作系统的

设置

我的代码使用C++11
高分辨率时钟
来测量经过的时间。我还使用Linux的
time
命令(
/usr/bin/time
)包装程序的执行。对于我的程序,
高分辨率时钟
报告2秒,而
时间
报告7秒(~6.5s用户和~0.5s系统)。另外,在time上使用verbose选项表明,我的程序使用了100%的CPU,其中有1个自愿性上下文切换和10个自愿性上下文切换(
/usr/bin/time-v

问题

我的问题是,是什么导致操作系统时间度量和性能时间度量之间存在如此巨大的差异

我最初的想法

根据我对操作系统的了解,我假设这些差异完全是由与其他程序的上下文切换引起的(如
time-v
所述)

这是造成这种差异的唯一原因吗?在查看代码性能时,我应该相信程序或系统报告的时间吗

同样,我的假设是相信我的程序计算出的时间超过Linux的时间,因为它比我的程序的CPU使用量多倍

注意事项

  • 我不是在发布代码,因为它与手头的问题并不相关。如果您想知道,这是一个简单的测试,它可以对100000000个随机浮点算术运算进行运算

  • 我知道我的C++代码中的其他时钟可能或多或少适用于不同的情况()。高分辨率时钟就是一个例子

编辑:按要求编码

#include <chrono>
#include <cstdlib>
#include <iostream>
#include <vector>

using namespace std;
using namespace std::chrono;

int main() {
  size_t n = 100000000;

  double d = 1;

  auto start_hrc = high_resolution_clock::now();

  for(size_t i = 0; i < n; ++i) {
    switch(rand() % 4) {
      case 0: d += 0.0001; break;
      case 1: d -= 0.0001; break;
      case 2: d *= 0.0001; break;
      case 3: d /= 0.0001; break;
    }
  }

  auto end_hrc = high_resolution_clock::now();
  duration<double> diff_hrc = end_hrc - start_hrc;
  cout << d << endl << endl;
  cout << "Time-HRC: " << diff_hrc.count() << " s" << endl;
}
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间std::chrono;
int main(){
规模=100000000;
双d=1;
自动启动_hrc=高分辨率_时钟::现在();
对于(尺寸i=0;i
您的系统似乎需要一段时间才能启动应用程序。可能是资源问题:可用内存不足(交换)或CPU订阅过多

在我的桌面上没有观察到显著的差异:

Time-HRC: 1.39005 s
real    0m1.391s
user    0m1.387s
sys     0m0.004s

time
的初始输出将是从程序开始到程序完成的时钟时间,如果有上下文切换,这可能需要一段时间,如您所述。我相信高分辨率时钟,因为它很可能在线程睡眠时也在睡眠。我知道您说过您不想显示代码,但最好是请确切地了解您是如何检测计时的,因此代码对此很有用。我上传了计时,这与我找到的每个关于高分辨率时钟的教程没有太大区别。如果我错了,请纠正我,但代码中的假设是,计时数代表秒?如果使用
std::chrono::duration\u cast,输出是什么(end_hrc-start_hrc)
?输出将是所经过秒数的整数表示。这是公平的。我怀疑这些值仍然存在显著差异,但我想检查一下。另外,
std::duration_cast(diff_hrc)
(使用您现在拥有的)