![](/img/trans.png)
[英]Why is iterating an std::array much faster than iterating an std::vector?
[英]Why are STL algorithms much faster with pointers than std::vector iterators?
為什么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,發布版本和“生成最快可能代碼”設置進行編譯。 這些測試是在不同的執行期間運行的,因此它們不應相互影響。
我的猜測是編譯器要么沒有做好優化,要么你正在調試模式下構建,編譯器使用特殊的,調試(慢)版本的STL容器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.