当在gcc中使用O2时,这个向量如何被优化10倍
How can this vector be optimized 10 times faster when using O2 in gcc?
这是我的代码:
while (vector0.size())
{
for (ii = vector0.begin(); ii != vector0.end(); ii++)
if (table[*ii] > table[*max]) max = ii;
/*
Here I add push_back something to vector and erase something from vector.
*/
}
热代码是for
循环和if
语句。
如果我在gcc(以及clang)中启用-O2
或-O3
,它将变得快10倍左右。我想知道这是怎么发生的。
才10次?游手好闲的人。我所期望的最大优化是删除operator[]
上的范围检查,这反过来使其可内联。此外,end
调用也可以内联(begin
调用一次,所以它是一个不关心)。
顺便说一句,就叫std::max_element
吧。
模板生成大量代码。大部分代码可以安全地删除,但这是一个昂贵的过程,只有在更高的优化级别上才能执行。
实际执行的优化取决于编译器和调用标志,但它是函数内联和死代码消除,在你的情况下产生非常显著的差异。
相关文章:
- 将一个双倍值乘以10会发生什么
- C++数组与向量排序(在我的情况下,向量比数组慢~2.5倍(无优化))
- 重复使用预分配的向量<复杂<double>>作为<double>长度两倍的向量
- 数组中的不同浮点值会影响性能 10 倍 - 为什么?
- C++,自使用boost和std::chrono的纪元以来的时间?为什么 Boost 版本慢 10 倍?
- 如何在 C++ 中将 2 中的数字倍数倍数在 2 中倍数 10 倍?
- 为什么我的最终向量是它应该大小的两倍并且具有前导 0?
- 计算向量的std ::映射为键的值,并将双倍作为值
- 测试用例大小为 10 的向量失败
- C++随机生成器在g++中比MSVC快10倍
- 相同的功能?使用 GMP(C++) 时运行速度慢约 10 倍
- 为什么为"Hello World"程序生成的代码对C++比为 C 生成的代码大 10 倍?
- 为什么将0.1f更改为0会使性能降低10倍
- Python套接字,下载几乎是原始文件大小的10倍,上传是0字节
- 普通c++代码比内联汇编器快10倍.为什么
- 矢量的访问向量<双倍*>
- 将文件读入结构体时大小增加10倍
- 当我所做的只是将循环代码移动到函数中时,代码运行速度会慢10倍
- OpenCL示例程序在CPU上的执行速度是在GPU上的10倍
- 当在gcc中使用O2时,这个向量如何被优化10倍