Linux 时间和代码中的性能时钟之间的差异
Difference between Linux time and Performance clocks in code
我是 运行 一些 C++ 代码计时的简单测试,我 运行 遇到了一个我不是 100% 肯定的工件。
设置
我的代码使用 C++11 high_resolution_clock
来测量经过的时间。我还使用 Linux 的 time
命令 (/usr/bin/time
) 包装了程序的执行。对于我的程序,high_resolution_clock
报告~2s 而time
报告~7s(~6.5s 用户和~.5s 系统)。还按时使用详细选项显示我的程序使用了 100% 的 CPU 和 1 个自愿上下文切换和 10 个非自愿上下文切换 (/usr/bin/time -v
)。
问题
我的问题是,是什么导致 OS 时间测量值和性能时间测量值之间存在如此巨大的差异?
我的初步想法
根据我对操作系统的了解,我假设这些差异完全是由与其他程序的上下文切换引起的(如 time -v
所述)。
这是造成这种差异的唯一原因吗?在查看代码性能时,我应该相信我的程序或系统报告的时间吗?
同样,我的假设是相信我的程序计算的时间超过 Linux 的时间,因为它比我的程序的 CPU 使用时间更多。
注意事项
我不会发布代码,因为它与手头的问题并不相关。如果你想知道这是一个简单的测试,乘以 100,000,000 运行dom 浮点算术运算。
我知道我的 C++ 代码中的其他时钟可能或多或少适用于不同的情况 (this stack overflow question)。 High_resolution_clock只是一个例子。
编辑:请求的代码
#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;
}
My question is what causes such a dramatic difference between OS time measurements and performance time measurements?
您的系统似乎需要一段时间才能启动您的应用程序。可能是资源问题:可用内存不足(交换)或超额订阅 CPU.
在我的桌面上没有观察到显着差异:
Time-HRC: 1.39005 s
real 0m1.391s
user 0m1.387s
sys 0m0.004s
我是 运行 一些 C++ 代码计时的简单测试,我 运行 遇到了一个我不是 100% 肯定的工件。
设置
我的代码使用 C++11 high_resolution_clock
来测量经过的时间。我还使用 Linux 的 time
命令 (/usr/bin/time
) 包装了程序的执行。对于我的程序,high_resolution_clock
报告~2s 而time
报告~7s(~6.5s 用户和~.5s 系统)。还按时使用详细选项显示我的程序使用了 100% 的 CPU 和 1 个自愿上下文切换和 10 个非自愿上下文切换 (/usr/bin/time -v
)。
问题
我的问题是,是什么导致 OS 时间测量值和性能时间测量值之间存在如此巨大的差异?
我的初步想法
根据我对操作系统的了解,我假设这些差异完全是由与其他程序的上下文切换引起的(如 time -v
所述)。
这是造成这种差异的唯一原因吗?在查看代码性能时,我应该相信我的程序或系统报告的时间吗?
同样,我的假设是相信我的程序计算的时间超过 Linux 的时间,因为它比我的程序的 CPU 使用时间更多。
注意事项
我不会发布代码,因为它与手头的问题并不相关。如果你想知道这是一个简单的测试,乘以 100,000,000 运行dom 浮点算术运算。
我知道我的 C++ 代码中的其他时钟可能或多或少适用于不同的情况 (this stack overflow question)。 High_resolution_clock只是一个例子。
编辑:请求的代码
#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;
}
My question is what causes such a dramatic difference between OS time measurements and performance time measurements?
您的系统似乎需要一段时间才能启动您的应用程序。可能是资源问题:可用内存不足(交换)或超额订阅 CPU.
在我的桌面上没有观察到显着差异:
Time-HRC: 1.39005 s
real 0m1.391s
user 0m1.387s
sys 0m0.004s