我使用以下方法对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使用率是否会影响它?
我没有要求更好地实施计时器。我问为什么会有所不同。
答案 0 :(得分:1)
简而言之,系统中存在少量cpu核心,但同时运行大量进程。为了实现这一点,操作系统会在为下一个操作执行相同操作之前为进程分配时间,依此类推。根据程序正在执行的操作,它们可能不需要,部分或全部时间片。随着这种情况的变化,运行的进程数量也会变化,每次调用代码之间可以有一段可变的时间 - 当与代码的常量执行时间相结合时,会导致不同的秒数。从你开始程序到完成程序时的挂钟。
由于QueryHighPerformance
函数返回挂钟上的时间,因此它没有考虑调度中的这些差异,因此它报告的变量是执行相同代码所需的时间。相同的数据。理想的计时器只会返回您的进程所消耗的时间 - 非常类似于" CPU Time" Win7任务管理器中可用的列(查看 - >选择列 - > CPU时间)