【问题标题】:Possible cause and solution for randomness in time measurements [duplicate]时间测量随机性的可能原因和解决方案[重复]
【发布时间】:2018-01-20 03:52:43
【问题描述】:

我得到了下面的时间测量结果,用于从我的具有 3.2Ghz 四核 CPU 和 24GB RAM 的 Windows 机器进行简单求和的重复计算。

代码如下。

从结果来看,求和时间大部分时间不到 3 毫秒,但有时可能需要 20 倍以上。我可以理解最大的最大值,因为时间测量的分布呈指数分布,右尾很长。

但我不确定的是:

  1. 随机性(变化)的原因是什么?请注意,我在 CPU 使用率为 2-4% 且内存为 10% 时运行应用程序。
  2. 随机性的可能解决方案。有什么办法可以避免罕见的最长持续时间?

结果

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++


【解决方案1】:

通用计算系统有许多任务在进行。在任何时候,系统都可能必须响应 I/O 中断(磁盘驱动器完成通知、计时器中断、网络活动……)并运行各种内务任务(后台备份、检查预定事件、索引用户文件……)。

它们发生的时间实际上是随机的。重复测量执行时间并丢弃异常值是一种常用技术。

【讨论】:

  • @Tae-SungShin 你可以提高进程优先级
猜你喜欢
  • 2020-07-17
  • 2014-01-27
  • 2010-12-11
  • 1970-01-01
  • 2015-12-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-03
  • 2021-02-10
相关资源
最近更新 更多