在Java中,普遍认为java.reflect API的性能代价很高。旧的Java版本有巨大的性能开销,而新版本似乎使其处于可接受的范围内。但“可接受”到底是什么意思呢?

这是我在评论一个建议用标准代码替换基于反射的代码的性能评估时提出的问题。由于我们的许多决策不是基于事实而是基于信念,所以我决定执行一些测试来获得Java8中的指标。

测试协议

为了通过一个不受挑战的协议获得实际的度量,我使用了优秀的JMH测试框架。JMH的优势包括:

Maven已经存在了

要进行基准测试的方法只需使用@benchmark进行注释

它处理JVM的预热

它还处理在控制台上写入结果的操作

以下是JMH的片段:

@Benchmark

public void executePerformanceTest() {

// Code goes here

}

JMH将负责执行上述executePerformanceTest()并负责测量所花费的时间。

反射代码

为了强调反射的成本,让我们检查一下使用反射访问属性和不使用反射调用简单getter所需的时间差异。

// With reflection

Field firstName = clazz.getDeclaredField("firstName");

Field lastName = clazz.getDeclaredField("lastName");

Field birthDate = clazz.getDeclaredField("birthDate");

Field.setAccessible(new AccessibleObject[] { firstName, lastName, birthDate }, true);

firstName.get(person);

lastName.get(person);

birthDate.get(person);

// Without reflection

person.getFirstName();

person.getLastName();

person.getBirthDate();

检查可能的优化

我想知道不可变的数据结构是否被编译成优化的字节码,从而降低反射的性能开销。

因此,我用两种不同的方式创建了相同的基本数据结构:

一个带有无参数构造函数和setter的变量

一个具有最终属性和构造函数初始化的不可变

反射结果

在我的机器上运行测试会产生以下结果:

# Run complete. Total time: 00:26:55

Benchmark Mode Cnt Score Error Units

BenchmarkRun.runImmutableWithReflection thrpt 200 2492673.501 ± 37994.941 ops/s

BenchmarkRun.runImmutableWithoutReflection thrpt 200 26499946.587 ± 242499.198 ops/s

BenchmarkRun.runMutableWithReflection thrpt 200 2505239.277 ± 27697.028 ops/s

BenchmarkRun.runMutableWithoutReflection thrpt 200 26635097.050 ± 150798.911 ops/s

对于对条形图感兴趣的读者(请注意,刻度是线性的):

java 反射为何耗性能_Java反射的性能成本相关推荐

  1. java 提高反射性能_java反射性能

    项目中用到了java的反射,可以大大减少代码量.但是反射的性能却不容乐观,做了个简单的测试,如下. public void noreflect() { Person p = new Person(); ...

  2. java 反射 慢在那里_Java 反射到底慢在哪?

    反射具体是怎么影响性能的?这引起了我的反思. 是啊,在阐述某个观点时确实有必要说明原因,并且证明这个观点是对的,虽然反射影响性能人尽皆知,我曾经也真的研究过反射是否存在性能问题,但并没有在写文章的时候 ...

  3. java和golang性能_Java本质和性能

    java和golang性能 最初的问题是如何计算二进制数中1的个数? 我包含了使用Integer.bitCount()的性能比较,该性能可以转换为固有特性,即单个机器代码指令POPCNT和执行相同功能 ...

  4. java 反射机制性能_Java反射机制的用途和缺点

    Java反射机制的用途和缺点 反射的用途 Uses of Reflection Reflection is commonly used by programs which require the ab ...

  5. java反射的性能_java反射的性能问题

    java反射效率到底如何,花了点时间,做了一个简单的测试.供大家参考. 测试背景: 1. 测试简单Bean(int,Integer,String)的set方法 2. loop 1亿次 3. 测试代码尽 ...

  6. java反射设置属性值_Java反射如何有效的修改final属性值详解

    前言 以前写过一篇 Java 反射修改 final 属性值,本文将在这里重新温习一下Java反射如何有效的修改final属性值,下面话不多说了,来一起看看详细的介绍: 假设有个类 class Pers ...

  7. java反射的编译过程_Java反射机制小结和实际操作

    一.什么是反射 1.编译和运行 在了解什么是Java反射机制前,先聊聊Java的编译和运行. 还记得第一次使用记事本编写第一个Java程序的场景吗?通过命令窗口,使用javac命令编译一个.java文 ...

  8. java反射有什么用_java反射的作用知识点总结

    Java的反射机制是Java特性之一,反射机制是构建框架技术的基础所在.灵活掌握Java反射机制,对大家以后学习框架技术有很大的帮助. 什么是Java的反射? 反射是Java的特征之一,是一种间接操作 ...

  9. java 反射机制详解_java反射机制原理详解

    反射机制:所谓的反射机制就是java语言在运行时拥有一项自观的能力.通过这种能力可以彻底的了解自身的情况为下一步的动作做准备.下面具体介绍一下java的反射机制.这里你将颠覆原来对java的理解. J ...

最新文章

  1. 形象解释Momentum
  2. english writing sample for professional
  3. ext 部署到 tomcat服务器下,通过http8080端口查看
  4. BNU OJ 第26303 题 Touchscreen Keyboard
  5. shell 如何避免误删目录
  6. c# webservice的简单示例
  7. 苹果se2_搜狗输入法适配苹果se2,给用户带来新玩法。
  8. css实现三栏布局的几种方法及优缺点
  9. 数据结构上机实践第七周项目4 - 队列数组
  10. linux 终端中文乱码解决方法
  11. python3修改文件内容_使用python 修改文件内容
  12. MongoDB从入门到高级的实战操作
  13. 载硫酸庆大霉素PLGA纳米粒PNPs(GS修饰PLGA纳米粒)/cRGD修饰PLGA纳米粒的制备方法
  14. 基于Java的地理位置定位系统
  15. Docker:从入门到入门
  16. Cannot resolve dependency ‘snabbdom‘ or ‘snabbdom/init‘
  17. VUE2版本引入Element UI
  18. 支付项目:5、通用型支付系统(1)
  19. Android支付接入
  20. 【Python】pd.read_excel应用

热门文章

  1. C语言实现二、十、十六进制的相互转换
  2. java插件相对布局,C#Winform中控件的布局思想
  3. git通过token登录
  4. 什么是SEO?搜索引擎优化是什么意思?
  5. RPC框架Kitex入门
  6. 抽象类、抽象方法、封装的概念、接口的含义(Java 从自学到就业 第12天)
  7. 从事非标自动化行业的难度很大?为什么?你知道吗?
  8. Nginx服务器安装
  9. 测试中遇到不可重现的Bug处理办法
  10. 网络基础 - 网关、网段、子网掩码、DNS