2014-12-08 59 views
1

我正在使用以下方法对STL容器矢量,deque,list,multiset和multimap进行一些操作。时序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使用率会影响它吗?

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

+0

同样的原因,它需要一个小时的时间,时钟从周五下午4:55到下午5:00 - 外星人! – 2014-12-08 04:35:36

+0

您是否正在编译优化?如果它没有副作用,你确定你正在计时的代码没有被优化吗?没有看到你正在运行的测试,很难猜测。 – 2014-12-08 04:49:54

+0

计时测试是没有意义的,如果你正在运行一个未优化或“调试”版本。 – PaulMcKenzie 2014-12-08 05:04:50

回答

1

简而言之,系统中有少量的cpu核心,但同时运行着大量的进程。为了实现这一点,操作系统将在为下一个操作等同之前分配时间给一个进程。根据正在做什么程序,它们可能不需要它们的部分或全部时间片。由于这种情况有所不同,正如运行的进程数量一样,您可以在每次调用代码之间有一段可变的时间间隔 - 如果与您自己的代码的恒定执行时间相结合,则会导致不同的秒数从你开始你的程序开始直到它完成的时间。

由于QueryHighPerformance函数返回挂钟上的时间,因此它不会考虑这些调度差异,因此它会报告变化的数量作为使用相同数据执行相同代码所需的时间。理想的定时器会回到你的过程中所消耗的时间只有 - 就像在Win7的任务管理器提供的“CPU时间”栏(查看 - >选择Columns-> CPU时间)