2014-03-02 46 views
0

我想盡可能快地通過std :: array進行線性掃描。我應該向前掃描(從索引0到索引n)還是向後掃描(從索引n到索引0),還是它很重要?掃描std :: array,向前或向後

+8

如果您認爲這可能很重要,那麼您應該有能力在真實的運行場景中進行測量。這是確切知道的唯一途徑。 – juanchopanza

+0

複雜度相同,但緩存性能可能會影響實際性能。我會繼續前進。 – stefan

+1

我強烈反對將此視爲「主要以意見爲基礎」。這是一個可教育的時刻,我認爲我們應該利用它來說明爲什麼_real_答案是要重新考慮這個問題。 – keshlam

回答

4

傳統上,建議將掃描n爲零,因爲在大多數體系結構中,比起其他數字,循環控制中的零比較便宜。 (正如其他人指出的那樣,預取緩存可能會也可能不會否定這個優點,這取決於體系結構的細節。)

確定是否實際上對您的方案產生影響 - 以及是否差異顯着你在循環體中做什麼 - 以及循環在應用程序性能上是否有所作爲 - 需要對特定的代碼和體系結構進行更多的分析,或者需要一些真實世界的測試。

試圖微觀優化的人們的標準提醒:無限提高性能,佔運行時間的1%,需要付出無限的努力並獲得1%的提升。佔10%運行時間的東西的10%改進需要花費很少的精力,併產生相同的好處。 不要浪費時間微觀優化錯誤的東西。做適當的性能分析,讓它引導你 - 記住算法或數據結構的變化可能比調整幾條指令更有效率。

+1

+1 for *「試圖微觀優化的人們的標準提醒」*任何當前的編譯器在微觀優化方面都遠勝於人類 – Manu343726

+0

+1,儘管我擔心一些讀者,但您的第一段將是唯一一個沉沒英寸 – Rotem

+0

因此,大膽嘗試引起對最後一段的注意。但我想首先試着回答問題,然後展開爲什麼它可能是錯誤的問題。 – keshlam

2

這很大程度上取決於實際情況。

這裏有兩個主要的事情要考慮。

首先是循環開銷,倒退(n0)循環在技術上可能會快一點。但是,只有當循環非常緊密時,這纔是重要的,這是循環主體足夠微不足道,並且邏輯實質上不受命令的影響。

另一件事是內存訪問,從歷史上看,CPU在緩存/預取轉發方面會更好,但是現在它們在兩種方式上都做得很好。事情是,這不是那麼簡單,因爲它取決於實際的訪問模式和CPU。

一個非常,非常一般答案可能是:與不平凡的身體和足夠大循環n也許應該是幾乎沒有任何差別。

但是實際的答案是:它很複雜,如果您懷疑它有可能導致任何實質性能差異,唯一可以告訴的方法就是測試它。