成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Java 中反射、內省的性能差距居然如此

開發 前端
基準測試的幾種情況已經準備好了,為了達到更充分的驗證,我們分別循環執行10、100、200、500次,我們跑一下基準測試看看效果。

你好,我是看山。

今天我們通過基準測試驗證下到底有多慢。

結果是我萬萬沒想到的,跑了好幾遍基準測試,不得不承認之前是自己不嚴謹了。

演示代碼

先定義使用場景:為一個JavaBean的屬性賦值。

@Data
public static class User {
    private String username;
    private int level;
}

為User的屬性賦值,我們有三種方式。

原生方式,作為基準:

final User user = new User();
user.setUsername("看山");
user.setLevel(100);

通過反射:

final Class<User> clazz = User.class;
final Constructor<User> constructor = clazz.getConstructor();
final User user = constructor.newInstance();

final Field usernameField = clazz.getDeclaredField("username");
usernameField.setAccessible(true);
usernameField.set(user, "看山");
final Field levelField = clazz.getDeclaredField("level");
levelField.setAccessible(true);
levelField.set(user, 100);

反射也可以通過調用setter方法賦值:

final Class<User> clazz = User.class;
final Constructor<User> constructor = clazz.getConstructor();
final User user = constructor.newInstance();

final Method setUsernameMethod = clazz.getMethod("setUsername", String.class);
setUsernameMethod.invoke(user, "看山");
final Method setLevelMethod = clazz.getMethod("setLevel", int.class);
setLevelMethod.invoke(user, 100);

使用內省賦值:

final BeanInfo beanInfo = Introspector.getBeanInfo(User.class);
final User user = new User();

final PropertyDescriptor[] props = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor prop : props) {
    if ("username".equals(prop.getName())) {
        final Method method = prop.getWriteMethod();
        method.invoke(user, "看山");
    } else if ("level".equals(prop.getName())) {
        final Method method = prop.getWriteMethod();
        method.invoke(user, 100);
    }
}

內省方式也可以直接指定屬性:

final User user = new User();

final PropertyDescriptor usernameProp = new PropertyDescriptor("username", User.class);
final Method usernameWriteMethod = usernameProp.getWriteMethod();
usernameWriteMethod.invoke(user, "看山");

final PropertyDescriptor levelProp = new PropertyDescriptor("level", User.class);
final Method levelWriteMethod = levelProp.getWriteMethod();
levelWriteMethod.invoke(user, 100);

好了,基準測試的幾種情況已經準備好了,為了達到更充分的驗證,我們分別循環執行10、100、200 、500次,我們跑一下基準測試看看效果。

測試效果

保留下500次循環的數據(回復:Java可以獲取源碼)

Benchmark                                                           Score        Error    
BeanSetJmhTest.testBase                                           671.299 ±     14.201    基準
BeanSetJmhTest.testAccessFieldCacheByReflectField                6451.184 ±    212.541    反射-緩存-屬性賦值
BeanSetJmhTest.testMethodCacheByReflect                         13381.968 ±   1921.017    反射-緩存-方法賦值
BeanSetJmhTest.testMethodCacheByIntrospector                    13523.807 ±   2146.288    內省-緩存-方法賦值
BeanSetJmhTest.testMethodByReflect                              44874.497 ±  14215.009    反射-方法賦值
BeanSetJmhTest.testAccessFieldByReflect                         57989.549 ± 282731.822    反射-屬性賦值
BeanSetJmhTest.testAccessFieldCacheByIntrospectorDirectProp    121879.007 ±  28027.596    內省-緩存-指定屬性賦值
BeanSetJmhTest.testAccessFieldCacheByIntrospectorProps         167602.264 ±  30272.412    內省-緩存-屬性循環賦值
BeanSetJmhTest.testAccessFieldByIntrospectorProps              204765.110 ±  53973.520    內省-屬性循環賦值
BeanSetJmhTest.testAccessFieldByIntrospectorDirectProp         783250.528 ±  40212.597    內省-指定屬性賦值

可視化結果:

基準測試結果基準測試結果

從結果看:

  1. 在設置屬性方面,反射性能優于內省;【上面結果是在JDK21測試的,試過JDK8、JDK17結果相似,不太確定有些文章說的內省性能優于反射是怎么測試的。】;
  2. 有緩存的邏輯性能會明顯優于沒有緩存的邏輯,無論是反射還是內省;
  3. 非必要情況,不要使用反射和內省,直接用JavaBean的setter賦值,性能差的太多。

責任編輯:武曉燕 來源: 看山的小屋
相關推薦

2025-01-20 00:00:00

反射Java語言

2010-03-12 08:55:06

Java內省反射

2021-07-11 09:34:45

ArrayListLinkedList

2025-01-10 00:00:00

內省機制JavaBean描述器

2025-05-26 04:00:00

Javanew效率

2009-07-14 18:09:08

Jython的內省

2011-02-28 09:51:43

內省

2024-01-17 10:05:09

Python內省反射機制

2011-05-25 14:46:16

程序員

2010-03-10 18:42:30

Python性能

2017-09-12 15:30:31

2010-05-07 17:50:31

Unix服務器

2023-04-10 07:26:28

UseStateUseReducer

2011-09-27 10:23:24

Java反射機制

2022-06-24 09:41:37

制造業技能物聯網

2011-07-01 15:04:49

Qt 內省

2023-07-05 14:38:09

2010-09-26 09:20:39

JVM1.6JVM1.5

2018-06-08 14:31:11

固態硬盤SSD

2011-08-02 18:07:03

iPhone 內省 Cocoa
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美亚洲国产成人 | 久久这里只有精品首页 | 久久久精品久久久 | 亚洲精品一区二区三区在线观看 | 久精品久久 | 国产免费观看视频 | 成人欧美一区二区 | 91一区二区三区在线观看 | 99精品国产一区二区三区 | 黄色网址在线免费观看 | 国产 日韩 欧美 制服 另类 | 国产人成精品一区二区三 | 天堂在线免费视频 | 99热首页 | 欧美成视频在线观看 | 黄色一级片aaa | 福利国产| 黄色成人在线 | 久久久久国产精品 | 中文字幕亚洲视频 | 亚洲国产精品99久久久久久久久 | 台湾佬伊人| 成年人精品视频 | 日韩在线一区二区 | 日韩三极| 一级黄色片美国 | 一级毛片视频 | 插插插干干干 | 欧美一级黑人aaaaaaa做受 | 天天拍天天射 | 久久精品色视频 | 日韩在线中文字幕 | av色噜噜 | 一区二区三区视频 | 日韩中文字幕一区二区三区 | 成人精品国产一区二区4080 | 一级黄色录像片子 | 一区二区三 | 在线看91 | www久久99| 天堂资源 |