簡體   English   中英

通過索引訪問向量的速度:向后與向前

[英]Speed of accessing a vector by index: backwards vs forward

由於緩存效應,向量的前向迭代將比(例如)隨機訪問更快:

for (unsigned i=0; i<vec.size(); i++) {
    vec[i] = something(i); 
}

現在,我需要向后迭代:

for (unsigned i=vec.size(); i-->0; ) {
    vec[i] = something(i);
}

在我的系統上,似乎沒有速度差異。 我是否可以假定在這里應用相同的緩存效果,因此在大多數系統上循環的速度相同?

關於硬件的假設幾乎總是一個糟糕的選擇-除非您牢記特定的硬件子集。 如果您打算讓代碼幾乎完全在現代x86硬件(例如Windows 8台式機)上運行,則可以假設此反向迭代的速度相同(通常與reverse_iterators相同 )。

但是,如果您針對移動技術,嵌入式系統或較舊的系統,則預期之間會有很大程度的差異。

就個人而言,我已經花了四年的時間為台式機商業開發優化軟件-那時我從來不需要優化向量迭代

如果您發現自己在平台上對軟件進行了性能分析,並發現在這方面需要優化, 則最好分配一個數組並手動迭代這些元素 但是,在您的開發初期,這樣的優化往往過於熱情。

毫無疑問,您可以創建自己的迭代器類,向量或數組類,以在您的特定情況下提供更快的迭代。 但是這樣做會極大地使您的代碼復雜化-最終會在調試代碼時引起問題。

“調試的難度是一開始編寫代碼的兩倍。 因此,如果您盡可能聰明地編寫代碼,那么就定義而言,您就不足以調試它。”〜Brian Kernighan

我個人建議,除非您有一個目標平台集的例子,否則您打算將其部署到異常的環境中,或者有一個特定的場景可以產生速度差異的證據。 假設標准庫向量適當地快。

也就是說,根據您希望執行的工作量,如果您有大量數據,則可能會發現更合適的std :: list; 請參閱以下鏈接: STL容器基准

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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