2010-07-13 109 views
1

我正在考慮製作一個由大網格組成的對象,存儲在一個二維數組中,以及在該網格上工作的函數。通過數組訪問數組元素比通過函數獲取數組元素更高效嗎?

如果我想遍歷對象之外的數組中的元素,訪問每個網格元素的最可讀和隱私尊重的方法是使用像grid.getElement(x,y)這樣的函數,它只需返回數組[x] [y]。

當程序被編譯成字節碼時,這是否比通過grid.array [x] [y]直接訪問數組效率低?

回答

6

它可能效率較低,但它取決於您的JVM。一個好的JIT可能能夠內聯函數,從而使代碼完全等價。

確切知道的唯一方法是使用您將使用的JVM進行基準測試。在你這樣做之前,你應該確認它甚至是重要的。 (即:配置文件,然後優化)除非您的配置文件告訴您某個代碼片段是瓶頸,請使用最乾淨的設計,並且不要嘗試像這樣進行微型優化。無論如何,它很可能不會爲你帶來任何可衡量的性能收益,而且它肯定會讓你的代碼難以維護。

2

很難肯定地說,如果這是性能足夠重要以至於值得爲之設計好的設計,我會分析。

JIT將內聯簡單函數,如getter。在許多情況下,JIT還可以消除數組邊界檢查。因此,如果完成這些優化,將數組訪問權限放在方法後面的性能可能不會比直接訪問性能差,但如果它們沒有完成,則性能可能會受到影響。

但是你可能會發現,如果數組足夠大,函數調用的開銷就會比內存瓶頸小得多,並且選擇算法,比如在矩陣上使用「塊」算法將會產生最大的區別,而不是如何訪問各個元素。

3

它可能效率稍低,但你應該讓編譯器和編譯器爲你做優化。

除非實際發現某些性能瓶頸,否則應主要關注API的可讀性和有效性。

3

除了性能上的考慮,通過函數訪問的機制肯定是「更乾淨」和「更安全」。首先,如果您不提供修改功能,則可以將數組元素顯示爲只讀。通過不提供對數組的引用,您也可以防止其他可能不需要的對數組的訪問;最後,通過不公開數組,您可以保持API的靈活性,以適應未來的修改,即用不同的數據結構替換數組。這些都是代碼質量方面的所有優點,並且在大多數情況下應該權衡得比在函數中包裝訪問所帶來的性能損失小很多。