计时 STL 容器 - 变化很大

Timing STL Containers - Wide Variation?

本文关键字:变化 STL 容器 计时      更新时间:2023-10-16

我使用以下方法来计时 STL 容器上的一些操作 向量、双端、列表、多集和多映射。

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 使用率会影响它吗?

我不是在要求更好的计时器实现。我问为什么会有所不同。

简单地说,系统中的 CPU 内核数量很少,但有大量进程同时运行。为了实现这一点,操作系统将在一个进程上分配时间,然后再对下一个进程执行相同的操作,依此类推。根据程序正在做什么,他们可能需要不需要、部分或全部时间片。由于这各不相同,运行的进程数也是如此,因此在每次调用代码之间可以有一个可变的时间段 - 当与您自己的代码的恒定执行时间相结合时,会导致挂钟上从启动程序到完成时间经过的秒数不同。

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