随笔 - 53, 文章 - 0, 评论 - 3, 引用 - 0
数据加载中……

访问Java对象属性的性能模型。

今天做了一个简单的性能测试。比较访问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的作用。

该测试结果和原先的猜想基本符合。但是性能评估很容易得到片面的结论,如果有错误的地方,请大家不吝指正。谢谢。

posted on 2010-04-09 15:57 InPractice 阅读(331) 评论(0)  编辑  收藏


只有注册用户登录后才能发表评论。


网站导航: