今天做了一個簡單的性能測試。比較訪問Java對象屬性的各種方法的性能差異。
1. 直接訪問對象的屬性。
2. 用方法訪問對象的屬性。
3. 用Map來存儲和訪問。
4. 反射-Field 訪問。
5. 反射-Method訪問。
重復100次,結果如下(單位為納秒)。
* 100 field access, 14,806<br/>
* 100 method access, 20,393<br/>
* 100 map access, 66,489<br/>
* 100 reflection field access, 620,190<br/>
* 100 reflection method access, 1,832,356<br/>
重復100000次,結果如下(單位為納秒)。
*100000 field access, 2,938,362
*100000 method access, 3,039,772
*100000 map access, 10,784,052
*100000 reflection field access, 144,489,034
*100000 reflection method access, 37,525,719 <br/>
由結果可見:
1。getter/setter 的性能已經接近直接屬性訪問(大約慢50%),沒有必要擔心getter/setter的性能而采用直接屬性訪問。
2。用Map代替POJO的代價大約是比getter/setter慢三倍。
3。反射訪問比getter/setter慢50到150倍。慎用。追求動態性的時候也要注意不菲的性能代價。
4。注意重復次數增加到100000次,方法訪問和屬性訪問的差距縮小;更有意思的是,反射的Method訪問比Field訪問快四倍。這主要是JIT的作用。
該測試結果和原先的猜想基本符合。但是性能評估很容易得到片面的結論,如果有錯誤的地方,請大家不吝指正。謝謝。