我想盡可能快地通過std :: array進行線性掃描。我應該向前掃描(從索引0到索引n)還是向後掃描(從索引n到索引0),還是它很重要?掃描std :: array,向前或向後
回答
傳統上,建議將掃描n爲零,因爲在大多數體系結構中,比起其他數字,循環控制中的零比較便宜。 (正如其他人指出的那樣,預取緩存可能會也可能不會否定這個優點,這取決於體系結構的細節。)
確定是否實際上對您的方案產生影響 - 以及是否差異顯着你在循環體中做什麼 - 以及循環在應用程序性能上是否有所作爲 - 需要對特定的代碼和體系結構進行更多的分析,或者需要一些真實世界的測試。
試圖微觀優化的人們的標準提醒:無限提高性能,佔運行時間的1%,需要付出無限的努力並獲得1%的提升。佔10%運行時間的東西的10%改進需要花費很少的精力,併產生相同的好處。 不要浪費時間微觀優化錯誤的東西。做適當的性能分析,讓它引導你 - 記住算法或數據結構的變化可能比調整幾條指令更有效率。
+1 for *「試圖微觀優化的人們的標準提醒」*任何當前的編譯器在微觀優化方面都遠勝於人類 – Manu343726
+1,儘管我擔心一些讀者,但您的第一段將是唯一一個沉沒英寸 – Rotem
因此,大膽嘗試引起對最後一段的注意。但我想首先試着回答問題,然後展開爲什麼它可能是錯誤的問題。 – keshlam
這很大程度上取決於實際情況。
這裏有兩個主要的事情要考慮。
首先是循環開銷,倒退(n
→0
)循環在技術上可能會快一點。但是,只有當循環非常緊密時,這纔是重要的,這是循環主體足夠微不足道,並且邏輯實質上不受命令的影響。
另一件事是內存訪問,從歷史上看,CPU在緩存/預取轉發方面會更好,但是現在它們在兩種方式上都做得很好。事情是,這不是那麼簡單,因爲它取決於實際的訪問模式和CPU。
一個非常,非常一般答案可能是:與不平凡的身體和足夠大循環n
有也許應該是幾乎沒有任何差別。
但是實際的答案是:它很複雜,如果您懷疑它有可能導致任何實質性能差異,唯一可以告訴的方法就是測試它。
- 1. 向後索引掃描與索引掃描
- 2. 的std ::移動或std ::向前C++
- 3. array std ::向量轉換
- 4. 實現徑向掃描
- 5. C++的std ::向前[]
- 6. 向前和/或向後移動控件
- 7. jQuery的向後或向前按鈕
- 8. C++ std :: array到shared_ptr的向量
- 9. 如何通過斑馬線掃描意向請掃描圖像?
- 10. 條形碼掃描儀重定向到掃描網址
- 11. Array獲取元素向後
- 12. 反向樹掃描,它是否可行?
- 13. 全表掃描或索引掃描
- 14. 迭代向前和向後
- 15. Java文件掃描器將光標向後移動
- 16. 如何修復向後掃描的PDF文檔?
- 17. 使用索引掃描向後改進SQL語句
- 18. STL容器向前和向後
- 19. Redux-saga和向前/向後機會
- 20. iBeacon後臺掃描
- 21. 後向前>>
- 22. 有條件地向後或向前迭代的最快方法
- 23. 如何在Swift中表示向前或向後範圍?
- 24. 骨幹路由檢測是否向前或向後按
- 25. 填充向前或向後取決於另一行
- 26. 用熊貓數據幀向前或向後計算
- 27. 向前或向後排列ISO 8601日期
- 28. 向後或向前斜槓在文件匹配.htaccess
- 29. 動態For循環(向前或向後計數)
- 30. 如何向前或向後確定在AJAX應用
如果您認爲這可能很重要,那麼您應該有能力在真實的運行場景中進行測量。這是確切知道的唯一途徑。 – juanchopanza
複雜度相同,但緩存性能可能會影響實際性能。我會繼續前進。 – stefan
我強烈反對將此視爲「主要以意見爲基礎」。這是一個可教育的時刻,我認爲我們應該利用它來說明爲什麼_real_答案是要重新考慮這個問題。 – keshlam