当前位置:网站首页>反射效率为什么低?
反射效率为什么低?
2022-07-07 07:53:00 【会飞的小石头】
反射效率为什么低
最近看spring源码相关内容,看到aop的实现,其中有动态代理涉及到反射内容,总有帖子说反射效率低,所以就想验证下反射效率是否整点低,以及低到什么程度?是否只要使用就很影响性能?
验证反射效率
代码
实体类
package org.springframework.test.reflect;
public class ReflectA {
private int age;
public String name;
private String sex;
public ReflectA(int age, String name, String sex) {
this.age = age;
this.name = name;
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
测试类
package org.springframework.test.reflect;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
/**
* 测试反射效率
*/
public class TestEfficiency {
private static final int AVERAGE_COUNT = 10;
private static final int executeCount = 1000;
public static void main(String[] args) {
long costTime = 0;
long reflectMethodCostTime=0,normalMethodCostTime=0,reflectFieldCostTime=0,normalFieldCostTime=0;
for(int index = 0; index < AVERAGE_COUNT; index++){
costTime = getNormalCallCostTime(executeCount);
reflectMethodCostTime += costTime;
costTime = getReflectCallMethodCostTime(executeCount);
normalMethodCostTime += costTime;
costTime = getNormalFieldCostTime(executeCount);
reflectFieldCostTime += costTime;
costTime = getReflectCallFieldCostTime(executeCount);
normalFieldCostTime += costTime;
}
System.out.println("reflectMethodCostTime: " + reflectMethodCostTime/AVERAGE_COUNT + " ms");
System.out.println("normalMethodCostTime: " + normalMethodCostTime/AVERAGE_COUNT + " ms");
System.out.println("reflectFieldCostTime: " + reflectFieldCostTime/AVERAGE_COUNT + " ms");
System.out.println("normalFieldCostTime: " + normalFieldCostTime/AVERAGE_COUNT + " ms");
}
private static long getReflectCallMethodCostTime(int count){
long startTime = System.currentTimeMillis();
for(int index = 0 ; index < count; index++){
ReflectA a = new ReflectA(12,"小明", "男");
try{
Method setName = a.getClass().getMethod("setName", String.class);
setName.setAccessible(true);
setName.invoke(a, "张三");
}catch(IllegalAccessException e){
e.printStackTrace();
}catch(InvocationTargetException e){
e.printStackTrace();
}catch(NoSuchMethodException e){
e.printStackTrace();
}
}
return System.currentTimeMillis()-startTime;
}
private static long getReflectCallFieldCostTime(int count){
long startTime = System.currentTimeMillis();
for(int index = 0 ; index < count; index++){
ReflectA a = new ReflectA(12,"小明", "男");
try{
Field ageField = a.getClass().getDeclaredField("name");
ageField.set(a, "李四");
}catch(NoSuchFieldException e){
e.printStackTrace();
}catch(IllegalAccessException e){
e.printStackTrace();
}
}
return System.currentTimeMillis()-startTime;
}
private static long getNormalCallCostTime(int count){
long startTime = System.currentTimeMillis();
for(int index = 0 ; index < count; index++){
ReflectA a = new ReflectA(12,"小明", "男");
a.setName("王五");
}
return System.currentTimeMillis()-startTime;
}
private static long getNormalFieldCostTime(int count){
long startTime = System.currentTimeMillis();
for(int index = 0 ; index < count; index++){
ReflectA a = new ReflectA(12,"小明", "男");
a.name = "候六";
}
return System.currentTimeMillis()-startTime;
}
}
输出结论
反射10次
- reflectMethodCostTime: 0 ms
- normalMethodCostTime: 0 ms
- reflectFieldCostTime: 0 ms
- normalFieldCostTime: 0 ms
反射100次
- reflectMethodCostTime: 0 ms
- normalMethodCostTime: 0 ms
- reflectFieldCostTime: 0 ms
- normalFieldCostTime: 0 ms
反射1000次
- reflectMethodCostTime: 1 ms
- normalMethodCostTime: 0 ms
- reflectFieldCostTime: 1 ms
- normalFieldCostTime: 0 ms
反射10000次
- reflectMethodCostTime: 7 ms
- normalMethodCostTime: 0 ms
- reflectFieldCostTime: 5 ms
- normalFieldCostTime: 0 ms
反射100000次
- reflectMethodCostTime: 23 ms
- normalMethodCostTime: 1 ms
- reflectFieldCostTime: 17 ms
- normalFieldCostTime: 1 ms
反射1000000次
- reflectMethodCostTime: 77 ms
- normalMethodCostTime: 2 ms
- reflectFieldCostTime: 31 ms
- normalFieldCostTime: 2 ms
结论
- 1.反射确实会比正常访问效率低
- 2.反射在100以内,对于性能的影响是可以忽略的,反射100-1000次之间存在一个反射影响效率的阈值
- 3.整体比较来看直接访问属性和直接通过方法访问属性效率较高,其次是反射获取属性,最后是反射获取方法。
边栏推荐
- Chris Lattner, père de llvm: Pourquoi reconstruire le logiciel d'infrastructure ai
- Future development blueprint of agriculture and animal husbandry -- vertical agriculture + artificial meat
- 【剑指Offer】42. 栈的压入、弹出序列
- web3.0系列之分布式存储IPFS
- 官媒关注!国内数字藏品平台百强榜发布,行业加速合规健康发展
- Postman interface test II
- Do you have a boss to help look at this error report and what troubleshooting ideas are there? Oracle CDC 2.2.1 flick 1.14.4
- STM32 ADC和DMA
- How to cancel automatic saving of changes in sqlyog database
- ORM--查询类型,关联查询
猜你喜欢

Appx代碼簽名指南

STM32 ADC和DMA

XML配置文件解析与建模

Google colab loads Google drive (Google drive is used in Google colab)

Fiddler break point

Weekly recommended short videos: what are the functions of L2 that we often use in daily life?

ORM -- logical relation and & or; Sort operation, update record operation, delete record operation

Delete a record in the table in pl/sql by mistake, and the recovery method

China's first electronic audio category "Yamano electronic audio" digital collection is on sale!
![[untitled]](/img/5b/61efbaded29250bc8d921b0cf087c8.png)
[untitled]
随机推荐
fiddler-AutoResponder
Postman interface test IV
MCU is the most popular science (ten thousand words summary, worth collecting)
Phpcms realizes PC website access to wechat native payment
ORM model -- associated fields, abstract model classes
flink. CDC sqlserver. You can write the DEM without connector in sqlserver again
Postman interface test V
中国首款电音音频类“山野电音”数藏发售来了!
ORM模型--关联字段,抽象模型类
Internship log - day07
ORM--数据库增删改查操作逻辑
STM32 Basics - memory mapping
ES6中的函數進階學習
Postman interface test I
ES6中的函数进阶学习
arcgis操作:dwg数据转为shp数据
uboot机构简介
LLVM之父Chris Lattner:为什么我们要重建AI基础设施软件
Chris LATTNER, the father of llvm: why should we rebuild AI infrastructure software
Interface test