我有一個父類,它有一個ints
的數組,但是1/3的子類只需要一個整數。在Java中,訪問整數數組的值與訪問單個整數變量的速度有多快?
我在這裏想知道,如果只是使用intAry[0]
這些類或不是那麼快。
我有一個父類,它有一個ints
的數組,但是1/3的子類只需要一個整數。在Java中,訪問整數數組的值與訪問單個整數變量的速度有多快?
我在這裏想知道,如果只是使用intAry[0]
這些類或不是那麼快。
訪問數組時,涉及到一個邊界檢查,這在訪問單個變量時不會發生。但是考慮到JIT
處理器緩存效應和其他類似情況,它會變得更加複雜,並且您不容易得出可靠的結論。
你會明智地專注於實際的熱點。
在java中訪問數組索引在概念上總是比訪問普通字段慢。這是因爲該字段直接包含在對象存儲器中,而在數組索引的情況下,它需要先讀取字段,然後再讀取索引。它也可能會導致檢查索引是否處於邊界的額外懲罰,JIT可能無法優化(基本上這意味着另一個讀取數組長度加上比較以及希望正確預測的分支)。
另一方面,如果你的類發生以前是單形的,引入子類可能會增加實際調用方法的額外成本。
雖然差可以在更復雜的設計,其中的總執行時間的顯著部分被用在別處在緊密循環顯著,其不顯着。
正如很多評論已經指出的那樣,在你編寫代碼之前嘗試優化它,並且在大部分時間都沒有任何提示的情況下進行優化是過早的優化,並且很可能浪費了時間和精力。
不成熟的優化是邪惡的 –
@VinceEmigh如果兩種版本的代碼在複雜性和可讀性方面是等同的,那麼選擇速度更快的代碼沒有任何壞處。雖然在這個特定情況下,我懷疑是否有重大差異。 – assylias
@assylias「*雖然在這種特殊情況下,我懷疑是否存在顯着差異*」這就是爲什麼它是邪惡的,並且傷害以浪費時間和精力的形式出現。在你甚至知道需要優化之前對事情進行優化可能會浪費大量時間,結果導致開發人員花費了一個小時的時間來研究這個主題,以便意識到他只能節省幾個納秒。這是一個很好的例子。 –