我正在使用以下方法对 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 );
}
过程很简单: 我有一个充满字符串的列表框,将它们移动到一个 vector 中,然后将 vector 中的元素添加到 STL 容器中。然后我从容器中移除所有元素并接收以微秒为单位的时间。
我的问题是关于变化的:有时我的试验与第一个试验相差 60,000 多微秒。为什么?这与计时器的实现有关吗?我已经指出了时间片和高速缓存的影响方向。谁能详细说明一下? CPU 使用率会影响它吗?
我并不是要求更好地实现计时器。我在问为什么会有所不同。
最佳答案
简单来说就是系统中的cpu核数很少,却同时运行着大量的进程。为了实现这一点,操作系统会先为一个进程分配时间,然后再为下一个进程分配时间,依此类推。根据程序正在执行的操作,它们可能不需要、部分或全部时间片。随着它的变化,以及运行的进程数量的变化,您可以在每次调用代码之间有一个可变的时间段 - 当与您自己的代码的恒定执行时间相结合时,会导致不同的秒数从您启动程序到程序完成的挂钟。
由于 QueryHighPerformance
函数返回挂钟耗时,因此它在调度时没有考虑这些差异,因此它会报告不同的数量作为执行相同代码所需的时间用相同的数据。理想的计时器将只返回您的进程消耗的时间——很像 Win7 任务管理器中可用的“CPU 时间”列(查看->选择列->CPU 时间)
关于c++ - 计时 STL 容器 - 广泛的变化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27351468/