定时STL容器 - 广泛的变化?

时间:2014-12-08 04:33:34

标签: c++ stl performancecounter

我使用以下方法对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使用率是否会影响它?

我没有要求更好地实施计时器。我问为什么会有所不同。

1 个答案:

答案 0 :(得分:1)

简而言之,系统中存在少量cpu核心,但同时运行大量进程。为了实现这一点,操作系统会在为下一个操作执行相同操作之前为进程分配时间,依此类推。根据程序正在执行的操作,它们可能不需要,部分或全部时间片。随着这种情况的变化,运行的进程数量也会变化,每次调用代码之间可以有一段可变的时间 - 当与代码的常量执行时间相结合时,会导致不同的秒数。从你开始程序到完成程序时的挂钟。

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