【发布时间】:2014-12-08 04:33:33
【问题描述】:
我正在使用以下方法对 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使用率有影响吗?
我并不是要求更好地实现计时器。我在问为什么它会变化。
【问题讨论】:
-
与周五下午 4:55 到 5:00 之间的时钟需要一个小时的原因相同 - 外星人!
-
你在编译优化吗?如果没有副作用,您确定您正在计时的代码没有被优化吗?如果没有看到您正在运行的测试,很难猜测。
-
如果您正在运行未优化或“调试”构建,那么您的时序测试将毫无意义。
-
我不确定这是否是正确的展示方式,但这里有一个显示测试视频的链接。 tinypic.com/r/2r462pw/8 项目源代码和 GUI 都是在 Visual Studio 2012 中完成的。不确定这是否回答了您的编译问题。
-
该视频没有显示您正在运行的测试代码或您是否正在使用优化进行编译。
标签: c++ stl performancecounter