【发布时间】:2018-01-20 03:52:43
【问题描述】:
我得到了下面的时间测量结果,用于从我的具有 3.2Ghz 四核 CPU 和 24GB RAM 的 Windows 机器进行简单求和的重复计算。
代码如下。
从结果来看,求和时间大部分时间不到 3 毫秒,但有时可能需要 20 倍以上。我可以理解最大的最大值,因为时间测量的分布呈指数分布,右尾很长。
但我不确定的是:
- 随机性(变化)的原因是什么?请注意,我在 CPU 使用率为 2-4% 且内存为 10% 时运行应用程序。
- 随机性的可能解决方案。有什么办法可以避免罕见的最长持续时间?
结果
Time Statistics (ms)
N : 10000
Minimum: 2.31406
Maximum: 64.7171
Mean : 2.43556
Std : 0.676273
M+6Std : 3.11184
代码:
#include "stdafx.h"
#include <Windows.h>
#include <iostream>
int main()
{
LARGE_INTEGER t_start, t_end, Frequency;
double tdiff,minx=1e+307,maxx=-1e+307,meanx=0,stdx=0;
int niter = 10000;
for (int j = 0;j < niter;j++)
{
QueryPerformanceFrequency(&Frequency);
QueryPerformanceCounter(&t_start);
double s = 0;
for (int i = 0;i < 1000000;i++) s += i;
QueryPerformanceCounter(&t_end);
tdiff = (double)(t_end.QuadPart - t_start.QuadPart) / (double)Frequency.QuadPart * 1000;
minx = min(minx, tdiff);
maxx = max(maxx, tdiff);
meanx += tdiff;
stdx += tdiff*tdiff;
//std::cout << "Iteration: " << j << " Time (ms): " << tdiff << std::endl;
}
meanx /= (double)niter;
stdx = sqrt((stdx - (double)niter*meanx*meanx) / (double)(niter - 1));
std::cout << "Time Statistics (ms) " << std::endl << std::endl;
std::cout << "N : " << niter << std::endl;
std::cout << "Minimum: " << minx << std::endl;
std::cout << "Maximum: " << maxx << std::endl;
std::cout << "Mean : " << meanx << std::endl;
std::cout << "Std : " << stdx << std::endl;
std::cout << "M+6Std : " << meanx+stdx << std::endl;
return 0;
}
【问题讨论】:
-
看看任务管理器,你会看到一百个任务,其中大部分在任何时间点都在休眠。但是如果其中 4 个同时唤醒(使用所有 4 个 CPU 内核),那么您的应用程序可能会被暂时挂起。与此同时,性能计数器将继续运行。
-
是的,没错。
-
Micro$oft Windows 不是实时操作系统。除了您的程序之外,还有很多事情正在发生,并且您的程序可以通过多种方式获取缓存或管道未命中,甚至命中页面文件。
标签: c++