std::vector::size() 是否比手动跟踪大小慢
Is std::vector::size() slower than keeping track of size manually?
std::vector::size()
每次调用时都会重新计算向量的大小,还是维护一个仅在修改向量时修改的计数器? 例如,如果我的类具有std::vector<double>
成员,那么在单独的计数器中跟踪其大小是否有任何速度优势?
size()
保证具有恒定的时间复杂度,并且在任何理智的实现中,操作将尽可能快。
this->_Mylast - this->_myFirst
通常涉及两次内存提取。 如果在寄存器中维护计数,则可能会更快。 我说可能,因为在一个小循环中,减去的两个值将在缓存中,这并不总是比寄存器慢很多 - 取决于机器。 一个聪明的编译器,使用一个紧密的循环,无论如何都可以在寄存器中维护两者,如果它得到正确的数据流分析。 在一个不那么小的循环中,你永远不会注意到差异。 在寄存器中维护它意味着每次迭代需要额外的操作来更新寄存器,如果可以与其他操作并行完成,则可能是免费的,或者可能会花费一个指令周期。 因此,很难衡量差异。
无论如何,您的里程会因处理器而异,即使 STL 的每个实现都有相同的size()
代码。
没有必要在单独的计数器中跟踪它的大小,因为它是在向量内部完成的。这个函数上的代码是这样的:
iterator begin() {return start;}
iterator end() {return finish;}
size_type size() const { return size_type(end() - begin());}
iterator start;
iterator finish;
变量"start"、"finish"将在你推送或弹出元素后更改,因此函数 size() 只需要减号时间。如果使用单独的计数器,则在推送或弹出元素时也会有一个加号或减号。
否 - 只需使用 std::vector::size()
在 MSVC 上,它是this->_Mylast - this->_Myfirst
实现的 - 您无法击败它。
正如其他人所说,它几乎不能变得更快。只有在矢量大小恒定的情况下,您确实可以通过使用此事实来节省一些 CPU 周期。实际上,您可以完全跳过查询大小。这对于渲染循环中经常重复的迭代等可能很重要。试想一下:
// reset vector of size=3 to value 10
for( size_t i=0; i < myvec.size(); ++i )
{
myvec[i] = 10.0;
}
对
myvec[0] = myvec[1] = myvec[2] = 10.0;
一个典型的用例是 3D 坐标向量、IP 地址等。但是准备好用你自己的例程替换一些在内部查询 size() 的 std::vector 例程。所以要点是,为了节省 CPU 周期,大小运算符不是目标,寻找其他逻辑位置。当你的矢量不改变它的大小时,即使是暂时的,你也有一只脚在门里挤出一些CPU周期。
PS:Valgrind是你的朋友,告诉你首先在哪里优化。事实上,大小运算符经常作为最佳候选者出现;至少对于某些算法。
祝你好运!
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 是否可以/希望创建不可复制的共享指针模拟(以启用weak_ptr跟踪/借用类型语义)?
- 如何确定我跟踪的对象球是否越过我绘制的线
- 是否可以在 ns2 中以无线跟踪格式添加字段
- 是否有一种便携式/标准的方法可以在堆栈跟踪中获取文件名和亚麻布
- C++向量的 2D 数组是否适合跟踪 2D 数组的动态域值?
- 如何跟踪Windows 7是否在C ++中以编程方式进入睡眠或休眠状态,就像在Windows XP中所做的那样
- 是否有一个演示 C/C++ OpenCV 程序,可以从网络摄像头进行简单的球跟踪
- 在没有PDB文件的情况下,是否可以在Windows上获得堆栈跟踪?如果是,如何
- std::vector::size() 是否比手动跟踪大小慢
- 是否可以使用 RegNotifyChangeKeyValue 来跟踪对注册表项值的更改
- 是否有任何标准的Visual Studio 2008插件可用于跟踪/记录C++项目的构造函数和析构函数调用
- 是否有C++11或Win32方法可以可靠地生成和保存跟踪信息
- VS2010调试器无法在监视窗口中正确跟踪变量,VS2013是否仍然存在此错误?
- 是否有一种方法来跟踪点后应用转换与openGL
- 我可以在跟踪之前查询ltng是否要跟踪具有给定参数的给定跟踪点
- 是否有一种方法可以从Linux发行版二进制文件中转储带有行号的堆栈跟踪信息?
- 是否有可能将复制粘贴的代码跟踪到从中检索的网站
- 是否有可能跟踪如果QLineEdit被点击