簡體   English   中英

為什么STL算法的指針要比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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM