为什么STL算法使用指针比std::向量迭代器快得多

Why are STL algorithms much faster with pointers than std::vector iterators?

本文关键字:std 向量 迭代器 快得多 指针 STL 算法 为什么      更新时间:2023-10-16

std::nth_element()被赋予指针而不是迭代器时,为什么它运行得更快?我希望std::vector和STL算法得到充分优化,但我的测量结果显示,当我将迭代器更改为指针时,执行时间下降了75%。

使用迭代器,以下代码(不包括向量的分配)在1200毫秒内运行:

std::vector<uint16_t> data(/* 50 million values */);
const double alfa = 0.01;
const double beta = 0.95;
std::nth_element(data.begin(), data.begin() + int(data.size() * alfa), data.end());
const uint16_t x = *(data.begin() + int(data.size() * alfa));
std::nth_element(data.begin(), data.begin() + int(data.size() * beta), data.end());
const uint16_t y = *(data.begin() + int(data.size() * beta));

使用指针,以下代码(不包括矢量的分配)在350毫秒内运行:

std::vector<uint16_t> data(/* 50 million values */);
const double alfa = 0.01;
const double beta = 0.95;
std::nth_element(&data.front(), &data.front() + int(data.size() * alfa),
    &data.front() + data.size());
const uint16_t x = *(data.begin() + int(data.size() * alfa));
std::nth_element(&data.front(), &data.front() + int(data.size() * beta),
    &data.front() + data.size());
const uint16_t y = *(data.begin() + int(data.size() * beta));

我观察到std::sort()也有类似的速度增加。这些示例是使用Embarcadero C++Builder XE8版本22.0.19027.8951、Release build和"生成尽可能快的代码"设置编译的。这些测试是在不同的执行过程中运行的,因此它们不应该相互影响。

我的猜测是,编译器要么在优化方面做得不好,要么在调试模式下构建,编译器使用特殊的调试(慢速)STL容器版本。