计时 STL 容器 - 变化很大
Timing STL Containers - Wide Variation?
我使用以下方法来计时 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 使用率会影响它吗?
我不是在要求更好的计时器实现。我问为什么会有所不同。
简单地说,系统中的 CPU 内核数量很少,但有大量进程同时运行。为了实现这一点,操作系统将在一个进程上分配时间,然后再对下一个进程执行相同的操作,依此类推。根据程序正在做什么,他们可能需要不需要、部分或全部时间片。由于这各不相同,运行的进程数也是如此,因此在每次调用代码之间可以有一个可变的时间段 - 当与您自己的代码的恒定执行时间相结合时,会导致挂钟上从启动程序到完成时间经过的秒数不同。
由于 QueryHighPerformance
函数返回挂钟上经过的时间,因此它没有考虑调度中的这些差异,因此它会报告一个不同的数量作为使用相同数据执行相同代码所需的时间。理想的计时器将仅返回进程消耗的时间 - 非常类似于Win7任务管理器中可用的"CPU时间"列(查看->选择列->CPU时间(
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 为什么这个运算符<重载函数对 STL 算法不可见?
- C++取消引用指针.为什么会发生变化
- 在C应用程序中运行C++(带有STL)函数
- 为什么在读取文件大小时文件IO速度会发生变化
- 使用2个键的cpp-stl::优先级队列排序不正确
- 在STL容器中使用模板类
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 用C++中的CPerson(类)类型的对象初始化STL矢量
- 将stl字符串缩小到小于15个字符的容量
- 在为LINUX创建共享库时,如何避免STL的私有/弱副本
- 检查函数返回类型是否与STL容器类型值相同
- STL算法函数在多个一维容器上的使用
- 内部 STL 容器结构能否在下一个标准中发生变化?
- 计时 STL 容器 - 变化很大
- STL push_back:在推送动态变化的数组时修改以前的值
- 如何列出所有的变化没有STL c++
- c++ STL标准是否有变化?
- 作用于可移动但不可复制对象序列的变化STL算法的行为
- STL排序集,其中的排序条件可能会发生变化