【问题标题】:Timing STL Containers - Wide Variation?定时 STL 容器 - 广泛的变化?
【发布时间】:2014-12-08 04:33:33
【问题描述】:

我正在使用以下方法对 STL 容器 vector、deque、list、multiset 和 multimap 的一些操作进行计时。

PrecisionTimer::PrecisionTimer()
{
   LARGE_INTEGER cps;
   LARGE_INTEGER init_cnt;

   QueryPerformanceCounter( &init_cnt );
   QueryPerformanceFrequency( &cps );

   start_count = init_cnt.QuadPart;
   microseconds_per_count = 1000000.0 / cps.QuadPart;
}

void PrecisionTimer::ReStart()
{
   LARGE_INTEGER init_cnt;
   QueryPerformanceCounter( &init_cnt );
   start_count = init_cnt.QuadPart;
}


// in microseconds
unsigned int PrecisionTimer::ElaspedTime() const
{
   LARGE_INTEGER cnt;
   QueryPerformanceCounter(&cnt);
   return (unsigned int)( ( cnt.QuadPart - start_count ) 
                         * microseconds_per_count + 0.5 );
}

过程很简单: 我有一个充满字符串的列表框,将它们移动到向量中,然后将向量中的元素添加到 STL 容器中。然后我从容器中删除所有元素并接收以微秒为单位的时间。

我的问题是关于变化的:有时我的试用版与第一个试用版相差 60,000 多微秒。为什么?它与计时器实现有关吗?我一直在指出时间片和高速缓存的效果方向。任何人都可以详细说明吗? CPU使用率有影响吗?

我并不是要求更好地实现计时器。我在问为什么它会变化。

【问题讨论】:

  • 与周五下午 4:55 到 5:00 之间的时钟需要一个小时的原因相同 - 外星人!
  • 你在编译优化吗?如果没有副作用,您确定您正在计时的代码没有被优化吗?如果没有看到您正在运行的测试,很难猜测。
  • 如果您正在运行未优化或“调试”构建,那么您的时序测试将毫无意义。
  • 我不确定这是否是正确的展示方式,但这里有一个显示测试视频的链接。 tinypic.com/r/2r462pw/8 项目源代码和 GUI 都是在 Visual Studio 2012 中完成的。不确定这是否回答了您的编译问题。
  • 该视频没有显示您正在运行的测试代码或您是否正在使用优化进行编译。

标签: c++ stl performancecounter


【解决方案1】:

简单地说,系统中的cpu核心数量很少,但同时运行的进程数量很多。为了实现这一点,操作系统将在为下一个进程执行相同操作之前为一个进程分配时间,依此类推。根据程序正在做什么,它们可能不需要任何时间片、部分时间片或全部时间片。由于这会发生变化,运行的进程数量也会有所不同,每次调用代码之间的时间段可能会有所不同 - 当与您自己的代码的恒定执行时间相结合时,会导致运行的秒数不同从您启动程序到完成的时间的挂钟。

由于QueryHighPerformance 函数返回挂钟上经过的时间,它没有考虑调度中的这些差异,因此它报告了一个变化的数量,作为使用相同数据执行相同代码所需的时间。理想的计时器将仅返回您的进程消耗的时间 - 很像 Win7 任务管理器中可用的“CPU 时间”列(查看->选择列-> CPU 时间)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2014-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多