阅读更多

0顶
0踩

编程语言

原创新闻 Java反射机制,速度提高1000倍

2017-09-19 10:52 by 副主编 jihong10102006 评论(1) 有16475人浏览
引用
原文:Java Reflection, 1000x Faster
作者: aka Nicolas Laurent
译者: Teixeira10

译者注:在本文中,作者例举了几个版本的代码,利用java发射机制,逐步提高代码运行速度,同时将Github上的代码进行展示。以下为译文:

几个星期前,我想让我的代码运行快1000倍,同时不改变复杂度,正如标题所说的,使用Java反射机制,可以让代码运行得更快。

首先来解释一下为什么会首先使用反射机制。

我有一个接口(表示一个树节点)和一个实现这个接口的大量类(100+)。诀窍在于,树是异构的,每个节点类型可以有不同数量的子节点,或者以不同的方式存储它们。

我需要让代码能够在这样的组合树上运行起来。简单的方法是简单地向接口添加一个children()方法,并在每个节点中实现它。当然,这很繁琐,也很乏味。

相反,我注意到所有的子节点都是直接的字段,或者聚集在包含节点集合的字段中。所以可以用反射的方式写一小段代码,这也对每一个节点都适用!

我已经在Github上放了一个简化版的代码。我会把相关的部分联系起来。

初始化代码

这是我提出的第一版本代码:WalkerDemoSlowest.java

它相当简单:获取节点类的方法,过滤掉那些不是getter的方法,然后只考虑返回节点或节点集合。调用这些方法,并在子节点上递归地调用walk方法。

如果我说这样的进展很慢,有人会感到惊讶吗?

缓存

有一个简单的调整,可以使它更快:使用缓存方法查找。

下面是缓存版本:WalkerDemoSlow.java

这和每个实现节点的类都是一样的,创建一个ClassData对象来缓存所有相关的getter方法,所以只需要查找一次,这会产生一个令人满意的10倍加速。

LambdaMetafactory 奇迹

不幸的是,这仍然太慢了。所以我向谷歌寻求帮助,发现了一个很有用的StackOverflow社区

有答案建议使用LambdaMetafactory,这是一个标准的库类,它支持lambda语法调用。

细节在我看来有些模糊,但似乎通过使用这些工具,可以在代码中“打开编译器”,并优化反射机制来进行本机调用。这就是一种假设。

这是代码:walkerdemofast.java

现在,我的代码可以做到100倍的加速。然而,在写这篇文章的时候,想用一些代码片段来演示这个效果,但是没有成功。我试着给接口实现3个子类,并使用一些伪方法进行过滤,但还是没有效果。第二版和第三版的代码运行速度差不多。

我重新检查了原来的代码,一切看起来都很好。在原始代码中,树是通过解析一些源文件得到的抽象语法树(AST)。如果限制了前14个源文件的输入,我发现会得到不同的结果。

这些文件相对较短(几乎没有10行),语法简单。但仅仅有这些,第二和第三版代码仍会以同样的速度运行。但是在第15个文件中进行输入(少于100行),那么第二个版本的代码会花费36秒,而第三个版本代码会在0.2秒内完成,这是700倍的差异。

我的假设是,如果场景足够简单,优化器会注意到正在运行的代码并选择离开。在更复杂的情况下,它会耗尽优化预算,然后回到未优化的版本以及糟糕的性能状态。但是,优化器已经足够灵活,如果有一个能击败它的示例,那似乎是非常成功的。

LambdaMetafactory可能性

我有点好奇LambdaMetafactory会有什么样的可能性。在我的示例中,它会产生奇迹,因为反射调用比简单的缓存查找要昂贵得多。但它是否也能对常规代码进行优化处理呢?这似乎不太可能让megamorphic call sites提供帮助,因为编译的方法必须以某种方式检索,而查找的成本将使收益相形见绌。

但是,如何在运行组合代码时进行优化呢?可以提供数据结构,或者为数据结构提供解释器,并使用LambdaMetafactory“编译”它们。这是否足够智能呢,可以对给定数据结构的代码进行部分评估,从而将解释器转换成等价的“plain”代码?

顺便说一下,这正是Truffle框架所采用的方法,它在Graal VM上运行,所以这个想法肯定有一定的意义。可能暂时无法使用当前的JVM,因此需要修改GraalVM。

在任何情况下,都会尽量使一些功能成为一个库,可以在“常规程序”(非编译器)中使用。编写简单的解释器通常是解决一些问题的最简单方法。
0
0
评论 共 1 条 请登录后发表评论
1 楼 OneZhous 2018-01-26 11:27
没有找到项目,是不是地址错了

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 哪些类用来实现java反射机制_JAVA反射机制

    运行时类型识别(Run-time Type Identification, RTTI)主要有两种方式,一种是我们在编译时和运行时已经知道了所有的类型,另外一种是功能强大的“反射”机制。要理解RTTI在Java中的工作原理,首先必须知道类型信息在...

  • Java 反射机制快速入门及常见方法全归纳。

    三、类加载 1、基本介绍 ▶ 基本概念 反射机制是java实现动态语言的关键,也就是通过反射实现类动态加载。①静态加载 : 编译时加载相关的类, 如果没有则报错, 依赖性太强。②动态加载 : 运行时加载需要的类,如果...

  • java反射机制原理详解

    java 反射

  • Java反射详解

    Java反射详解

  • Java 反射原理

    Java 反射原理

  • 如何利用缓存机制实现JAVA类反射性能提升30倍

    一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红《JAVA类反射技术&优化》 分享者:宜信支付结算部支付研发团队...

  • Java反射——反射机制问题——第一章

    文章目录1:一个需求引出反射2:反射入门3:反射原理图4: 反射是我们框架的灵魂,反射也是我们框架的一个底层基石,没有反射也就没有框架,如果我们学好了反射,对我们阅读框架底层是有很大班助的——阿俊。有些...

  • 【Java高级】框架底层基础:Java的反射机制剖析

    本文通过案例,由浅入深,帮助大家了解为什么需要反射,以及反射的用处。并且,对反射的原理进行了刨析,总结了反射相关的类。同时,反射也给我们带来了效率的问题,而反射的调用优化也被梳理了进来。最后,本文梳理...

  • 总结Java反射面试题(附答案)

    反射机制是程序在运行时能够获取自身的信息。在java中,只要给定类的名字,那么就可以通过反射机制来获得类的所有信息。今天总结了java反射面试题10道,各位java程序员可以根据这篇java反射面试题,来回顾一下java...

  • Java学习路线总结,搬砖工逆袭Java架构师

    定期分享Java硬核技术干货、分享Java学习路线、分享Java经典面试题

  • 【韩顺平】Java反射机制笔记

    文章目录1、前言2、一个需求引出反射3、反射机制3.1 Java Reflection3.2 反射机制原理图3.3 反射机制可以完成的功能3.4 反射相关的主要类3.5 反射的优点和缺点3.6 反射调用优化——关闭访问检查4、Class对象4.1 基本...

  • Java 反射技术:(三)提高反射效率

    反射机制对程序的运行在性能上有一定的影响,速度慢 1.如何提高反射的性能 通过 setAccessible 提高性能 1.setAccessible 启用和禁用访问安全检查的开关,值为 true 则指示反射的对象在使用时应该取消 Java 语言...

  • 【Java 基础语法】详解 Java 的反射

    获取 Class 对象4.1 Class 类(反射机制的起源)4.2 获取 Class 对象三种方式5. 反射的使用6. 反射的优点和缺点 1. 定义 Java 的反射(Reflection)机制是在运行状态中,对任意一个类,都能够知道这个类的所有属性...

  • 7.Java反射面试题

    5、反射的实现方式6、实现Java反射的类7、反射机制的优缺点优点:缺点 :8、Java 反射 API反射 API 用来生成 JVM 中的类、接口或则对象的信息。9、反射使用步骤(获取 Class 对象、调用对象方法)10、获取 Class ...

  • Java反射&序列化

    ​ JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射...

  • 小白都能学会的Java注解与反射机制

    文章目录一 什么是注解Ⅱ 内置注解Ⅲ 自定义注解Ⅳ 注解案例Ⅴ Java 反射机制5.1 Java反射机制提供的功能5.2 Java反射机制的优缺点5.3 Java反射相关的主要API5.4 Class类Ⅵ 类加载过程5.1 何时会发生类初始化Ⅶ 类...

  • c反射机制介绍_介绍反射

    在“ Java编程动力学,第1部分 ”中,我向您介绍了... 为了使即使对于已经了解反射基础知识的开发人员来说,也使事情变得有趣,我将介绍反射性能与直接访问的比较。 不要错过本系列的其余部分 第1部分,“ 类和...

  • 一个用于配置移动应用开发环境的自动化脚本

    可以帮助开发者自动安装Android SDK、Android NDK、Java开发工具包(JDK)以及Flutter SDK,这些都是移动应用开发(特别是Android和Flutter应用)所必需的。 脚本首先定义了一些变量,用于存储工具的安装路径和版本。然后,定义了一个install_tool函数,用于检查工具是否已安装,如果没有安装则执行安装命令。 接着,脚本定义了install_android_sdk、install_android_ndk、install_java_jdk、set_java_env和install_flutter_sdk等函数,分别用于安装Android SDK、Android NDK、Java JDK、设置Java环境变量以及安装Flutter SDK。 在主程序部分,脚本按照顺序调用这些函数来安装和配置各个工具。安装完成后,脚本会输出一条消息表示配置已完成。

  • AI Agent智能应用从0到1定制开发

    AI Agent智能应用从0到1定制开发 关键特点: 自动化:AI Agent可以自动执行重复性任务,提高效率并减少人力成本。 智能决策:基于复杂的算法,AI Agent能够进行决策支持,分析数据并提供洞察。 自然语言处理:许多AI Agent具备理解和生成自然语言的能力,使其能够与人类用户进行交流。 机器学习:AI Agent可以利用机器学习技术从经验中学习,不断优化其性能。 个性化:AI Agent能够根据用户的行为和偏好提供个性化的体验。 可扩展性:AI Agent可以设计成模块化,方便扩展新功能或适应不同规模的需求。 实时响应:AI Agent能够提供快速的实时响应,满足紧急任务的需求。

Global site tag (gtag.js) - Google Analytics