我有問題糾正我通過使用索引訪問(使用運算符[])或使用迭代器訪問向量元素的效率的理解。向量索引訪問與迭代器訪問的效率
我的理解是「迭代器」比「索引訪問」更有效率。 (我認爲vector::end()
比vector::size()
更有效)。
現在我寫示例代碼測量它(在Windows 7下使用Cygwin,使用g ++ 4.5.3)
索引接入環路版本(以前標記爲隨機接入):
int main()
{
std::vector<size_t> vec (10000000);
size_t value = 0;
for(size_t x=0; x<10; ++x)
{
for (size_t idx = 0; idx < vec.size(); ++idx)
{
value += vec[idx];
}
return value;
}
}
該迭代循環代碼是這樣的:
for (std::vector<size_t>::iterator iter = vec.begin(); iter != vec.end(); ++iter) {
value = *iter;
}
我很驚訝地看到「索引訪問」版本更快。我使用time
命令來「測量」。數量分別爲:
結果使用
g++ source.cpp
(不優化) 索引訪問真正的800ms
迭代器訪問
真正2200ms
,這些數字有意義嗎? (我拉肚子多次重複的),我不知道什麼細節我想,爲什麼我錯了......
結果使用G ++ -02 索引訪問,時間真:〜200ms的
迭代器訪問,真實時間:〜200毫秒
我重複不同的平臺上測試(AMD64瓦特/ g ++以及POWER7瓦特方xIC)和看到,我使用的所有時間優化的代碼的示例方案也有類似的執行時間。
編輯更改代碼以添加值(value += *iter
)而不是僅使用賦值。增加了關於編譯器選項添加了使用-O2的新號碼。 * edit2將標題改爲「迭代器效率」改爲「訪問效率」。
確保您沒有編譯調試支持,尤其是在MSVC下。另外,你的第一個版本根本不使用迭代器,而在第二個版本中你有*隨機訪問迭代器。 – 2012-02-29 20:24:15
你在使用'-O2' /'-O3'嗎? – 2012-02-29 20:25:50
你打開優化了嗎? – 2012-02-29 20:26:54