当前位置:网站首页>反射效率为什么低?
反射效率为什么低?
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.整体比较来看直接访问属性和直接通过方法访问属性效率较高,其次是反射获取属性,最后是反射获取方法。
边栏推荐
- fiddler-AutoResponder
- Future development blueprint of agriculture and animal husbandry -- vertical agriculture + artificial meat
- 柏拉图和他的三个弟子的故事:如何寻找幸福?如何寻找理想伴侣?
- ES6中的函数进阶学习
- 【剑指Offer】42. 栈的压入、弹出序列
- Internship log - day04
- This article explains the complex relationship between MCU, arm, muc, DSP, FPGA and embedded system
- Why are social portals rarely provided in real estate o2o applications?
- Guys, have you ever encountered the case of losing data when Flink CDC reads mysqlbinlog? Every time the task restarts, there is a probability of losing data
- 为什么安装mysql时starting service报错?(操作系统-windows)
猜你喜欢
SQLyog数据库怎么取消自动保存更改
China's first electronic audio category "Yamano electronic audio" digital collection is on sale!
Delete a record in the table in pl/sql by mistake, and the recovery method
ORM--数据库增删改查操作逻辑
STM32 Basics - memory mapping
ES6中的原型对象
Web3.0 series distributed storage IPFs
Postman interface test IV
[ORM framework]
虚数j的物理意义
随机推荐
ORM model -- associated fields, abstract model classes
ORM模型--关联字段,抽象模型类
Enterprise practice | construction of banking operation and maintenance index system under complex business relations
Finally, there is no need to change a line of code! Shardingsphere native driver comes out
Guid主键
[learning notes - Li Hongyi] Gan (generation of confrontation network) full series (I)
LLVM之父Chris Lattner:为什么我们要重建AI基础设施软件
Appx代码签名指南
Deadlock caused by non clustered index in SQL Server
The story of Plato and his three disciples: how to find happiness? How to find the ideal partner?
This article explains the complex relationship between MCU, arm, muc, DSP, FPGA and embedded system
一文讲解单片机、ARM、MUC、DSP、FPGA、嵌入式错综复杂的关系
Why does the starting service report an error when installing MySQL? (operating system Windows)
嵌入式背景知识-芯片
Three years after graduation
ISP、IAP、ICP、JTAG、SWD的编程特点
Applet sliding, clicking and switching simple UI
Future development blueprint of agriculture and animal husbandry -- vertical agriculture + artificial meat
【acwing】789. 数的范围(二分基础)
Inno setup packaging and signing Guide