测试Java反射效率

2023-05-16

测试分为3个方面:1. 实例化效率;2. 方法调用效率;3. 成员变量GET调用效率;4. 成员变量SET调用

测试环境:

Windows 7

Sun Java 1.6

 

先写好备测试用的类

import java.util.Date;


public class DemoClass{
	public String firstName;
	private String endName;
	private Date birthDay;
	private String email;
	private String phone;
	private DemoClass parent;
	
	public String getFirstName() {
    	return firstName;
    }
	public void setFirstName(String firstName) {
    	this.firstName = firstName;
    }
	public String getEndName() {
    	return endName;
    }
	public void setEndName(String endName) {
    	this.endName = endName;
    }
	public Date getBirthDay() {
    	return birthDay;
    }
	public void setBirthDay(Date birthDay) {
    	this.birthDay = birthDay;
    }
	public String getEmail() {
    	return email;
    }
	public void setEmail(String email) {
    	this.email = email;
    }
	public String getPhone() {
    	return phone;
    }
	public void setPhone(String phone) {
    	this.phone = phone;
    }
	public DemoClass getParent() {
    	return parent;
    }
	public void setParent(DemoClass parent) {
    	this.parent = parent;
    }
}
 

 

1. 实例化效率

1) 正常调用

public class TestReflectNew {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	DemoClass.class.newInstance();
	    	new DemoClass();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

三次输出:

18 MillSeconds

19 MillSeconds

20 MillSeconds

均值:19

 

2) 反射调用

public class TestReflectNew {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	DemoClass.class.newInstance();
//	    	new DemoClass();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

191 MillSeconds

193 MillSeconds
192 MillSeconds

均值:192

 

2. 方法调用测试

1) 正常调用

public class TestReflectMethod {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	DemoClass.class.getMethod("getBirthDay").invoke(dc);
	    	dc.getBirthDay();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

2 MillSeconds

2 MillSeconds

2 MillSeconds

均值:2

2) 反射调用

public class TestReflectMethod {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	DemoClass.class.getMethod("getBirthDay").invoke(dc);
//	    	dc.getBirthDay();
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

1223 MillSeconds

1201 MillSeconds

1207 MillSeconds

均值1210

 

3. 测试成员变量GET

1) 正常调用

public class TestReflectFieldGet {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	s = (String) DemoClass.class.getField("firstName").get(dc);
	    	s = dc.firstName;
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

2 MillSeconds

1 MillSeconds

3 MillSeconds

均值:2

 

2) 反射调用

public class TestReflectFieldGet {

	public static void main(String[] args) throws Exception{
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	s = (String) DemoClass.class.getField("firstName").get(dc);
//	    	s = dc.firstName;
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

992 MillSeconds

1000 MillSeconds

1005 MillSeconds

均值:999

 

4. 测试成员变量SET

1) 正常调用

public class TestReflectFieldSet {

	public static void main(String[] args) throws Exception {
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s = null;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
	    	dc.firstName = s;
//	    	DemoClass.class.getField("firstName").set(dc, s);
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
}

 三次输出:

1 MillSeconds

2 MillSeconds

2 MillSeconds

均值:1.7

2) 反射调用

public class TestReflectFieldSet {

	public static void main(String[] args) throws Exception {
	    
	    int i = 0;
	    DemoClass dc = new DemoClass();
	    String s = null;
	    long start = System.currentTimeMillis();
	    while(i<1000000){
	    	i++;
//	    	dc.firstName = s;
	    	DemoClass.class.getField("firstName").set(dc, s);
	    }
	    
	    long end = System.currentTimeMillis();
	    System.err.println((end - start) + " MillSeconds");
    }
} 

三次输出:

998 MillSeconds

1021 MillSeconds

1007 MillSeconds

均值:1009

 

来个统计

反射平均时间非反射平均时间比值
实例化1921910
方法调用12102605
成员Get9992500
成员Set10091.7593

 

 

以上测试的方式如果有不合理的地方请eye友们指点,看看测试的方法是否得当,是否全面

 

本人新博客:tuoxie.me

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

测试Java反射效率 的相关文章

  • python正则表达式

    python正则表达式 match函数 re match尝试从字符串的起始位置匹配一个模式 xff0c 如果不是起始位置匹配成功的话 xff0c match 就返回none 函数语法 xff1a re span class token pu
  • 轻松解决VS配置OpenCV环境及导出OpenCV的VS项目模板

    一 OpenCV配置 1 下载OpenCV 点击进入下载OpenCV的官网界面 这里以Windows为例 xff0c 其他同理 xff08 可直接下载最新 xff09 2 提取OpenCV 在这里浅说一句 xff0c 为了方便环境配置文件管
  • 最大子段和问题

    以下给出具体代码 xff1a span class token macro property span class token directive hash span span class token directive keyword i
  • 如何简单又好看地美化你的Ubuntu界面

    起因 最近使用Ubuntu界面实属是审美疲劳了 xff0c 使用老版本的一大问题就是 界面太难看了 秉持新手学习最好是用老一点的稳定版本的观念 Ubuntu旧版本使用或使用过的人非常非常多 xff0c 学习的过程中你一旦出现什么问题互联网上
  • 【实战】物联网安防监控项目【2】———boa服务器的移植

    一 boa服务器的移植 1 源码下载 1 1 boa简介 xff1a 其可执行代码只有大约60KB左右 xff0c Boa是一个单任务的HTTP服务器 xff0c Boa只能依次完成用户的请求 xff0c 而不会fork出新的进程来处理并发
  • 【实战】物联网安防监控项目【4】———从网页上控制A9的LED灯

    前言 学习了一个新知识 xff0c 当然要记录一下啦 这两天学习了boa服务器 cgic标准库和html标签语言 xff0c 又双叕解锁一个嵌入式的新玩法 cgic库是沟通C语言和html网页编程语言的一座桥梁 xff0c 通过在linux
  • 【实战】物联网安防监控项目【5】———把模拟数据传输到web网页、web显示mjpeg-streamer视频图像

    1 模拟数据传输到web 为了把硬件传感器上的数据上传到web网页 xff0c 我们需要在跑linux服务器的开发板上写一个应用程序 xff0c 并创建出几个线程来收集传感器检测到的数据 xff0c 通过进程 线程间通信 boa与cgic库
  • HttpGet Digest授权认证

    工具类 xff1a compile com burgstaller okhttp digest 1 13 import android span class hljs preprocessor content span span class
  • ubuntu下git push失败error: 无法推送一些引用到 ‘xxx ‘解决方法

    如果你在Ubuntu下使用git push上传你的代码到gitee xff0c 突然出现一行报错 xff1a To git 64 gitee com imysy twenty two thread pool test git rejecte
  • 【Linux驱动开发】并发控制机制:原子操作、自旋锁、信号量、互斥锁详解

    并发控制机制 首先我们来了解一下 操作系统的并发性 这个概念 xff1a 操作系统的并发性 concurrence xff1a 指的是两个或者两个以上事件在同一时间间隔内发生 xff0c 即这个设备一会执行这个事件一会执行那个事件 xff0
  • STM32F051K8U6按键中断实例

    引言 最近要开始做毕设了 xff0c 准备用STM32做一个平衡小车 xff0c 好久没做过STM32的裸机项目了 xff0c 做几个项目练练手 xff0c 复习一下 本例程使用STM32CubeMX配套hal库来实现按键中断和串口中断 芯
  • STM32库函数笔记分享

    之前刚开始自学的部分STM32笔记放出 xff0c 希望对新入门STM32和想要复习库函数的小伙伴们起到帮助 建立工程 1 寄存器操作方式 需要不断地查手册来了解每一位是干什么用的 优点 xff1a 代码简介 xff1b 缺点 xff1a
  • rc.exe not found.(完美解决,亲测有效)

    完美解决rc exe not found 报错出错原因解决方法完美解决 报错 这两天安装了vs2015和IVF2016 xff0c 安装完之后在运行程序的时候一直会出现rc exe not found xff0c 重新生成解决方案后还是一样
  • 单片机与上位机通过串口通信--笔记

    定义 先说什么是串口 xff1f xff08 1 xff09 他是一种通信接口 xff0c 单片机 IO 口上的复用功能 xff0c 上位机 xff08 电脑 xff09 和下位机 xff08 开发板 xff09 之间的数据传输 xff08
  • Qt 的Cmake方式如何创建资源文件

    传统的qmake创建的工程有pro qrc xff0c 但是如果使用cmake方式创建的工程就没有这两个东西 xff0c 我们公司就是在linux下使用cmake创建的Qt工程 xff0c 没有pro也看不到qrc xff0c 想在ui界面
  • 理解ROS Topic 通信频率背后的机制

    Topic是ROS的三种通信方式中最为基本 也是常用的一种 本文对于ROS的Topic通信背后的数据吞吐机制做一个较为详细 深入的介绍 Publisher ROS中发布一个topic的函数是这样的 ros span class token
  • Linux应用层例程4 串口应用编程

    本小节我们来学习 Linux 下串口应用编程 xff0c 串口 xff08 UART xff09 是一种非常常见的外设 xff0c 串口在嵌入式开发领域当中一般作为一种调试手段 xff0c 通过串口输出调试打印信息 xff0c 或者通过串口
  • Linux应用层例程7 CAN 应用编程基础

    CAN 是一种多主方式的串行通讯总线 xff0c 基本设计规范要求有高的位速率 xff0c 高抗电磁干扰性 xff0c 而且能够检测出产生的任何错误 经过几十年的发展 xff0c 现在 xff0c CAN 的高性能 高可靠性以及高实时性已被
  • 使用Socket方式调用HttpWebApi获取数据

    背景 xff1a 最近有一个需求 xff0c 单片机需要调用服务端Api获取数据 xff0c 因为一些原因单片机只能使用TCP方式 xff1b 作为服务端开发人员提供Demo 代码如下 xff08 这里用C 语言演示 xff09 using
  • git branch 和 tag的区别

    1 git branch 和 tag的区别 xff1f 1 git branch 上的修改可以保留 xff0c 例如在某个branch上commit一个新的节点 checkout到其它branch后commit的节点不会丢 2 git ta

随机推荐

  • 测线仪正确使用方法图解1

    测线仪正确使用方法图解1 测线仪正确使用方法图解2 测线仪正确使用方法图解3 测线仪正确使用方法图解 xff0c 我们来使用莱视威测试仪YN891 xff0c 先说说第一个功能 xff0c 测线 xff0c 首先 xff0c 我们打开旁边的
  • Git仓库分支(Branch)和标签(Tag)

    仓库的分支 Branch 规范 xff0c 影响到每个团队的工作流的一致性 xff1b 标签 Tag 便于开发团队 测 试团队和其他团队识别每个项目的版本 xff0c 特别是在协同处理线上问题的时候 xff0c 大家可以非常清楚 地知道线上
  • printf如何按二进制格式打印

    printf函数 xff1a int printf const char format format 这是字符串 xff0c 包含了要被写入到标准输出 stdout 的文本 它可以包含嵌入的 format 标签 xff0c format 标
  • QAV250四轴穿越机安装全程详解(多图)

    QAV250四轴穿越机安装全程详解 最近团队准备使用轻型穿越机QAV250做实验 xff0c 本文记录了QAV250的安装过程 xff0c 整理了开箱后较合理的安装顺序 xff0c 以及各个步骤的注意事项 xff0c 希望对有需要的朋友有所
  • 【C语言】进度条实现

    模拟电脑程序安装的进度条 提供两种方式 代码如下 xff1a include lt stdio h gt include lt string h gt include lt windows h gt void proc int i 61 0
  • ROS 使用记录(3) 自定义消息格式

    文章目录 0 前言1 创建 96 msg 96 文件2 构建 pkg 解析 96 msg 96 文件3 在其他 pkg 中使用自定义消息 0 前言 ROS 中可通过 publisher subscriber 和 topic 实现设计模式中的
  • TCPIP调试助手及源代码

    TCP IP xff08 Transmission Control Protocol Internet Protocol xff0c 传输控制协议 网际协议 xff09 是指能够在多个不同网络间实现信息传输的协议簇 TCP IP协议不仅仅指
  • springsecurity密码验证原理概括

    springsecurity密码验证原理概括 前言1 UsernamePasswordAuthenticationFilter2 ProviderManager3 AbstractUserDetailsAuthenticationProvi
  • 任务栈

    3 1 什么是任务栈 任务栈是一种以栈的形式放置Activity实例的容器 xff0c 遵循先进后出原则 xff0c 包含压栈和出栈两个基本操作 3 2 任务栈出现的原因 最直接的体现就是提升用户体验 xff0c 如果没有任务栈 xff0c
  • 在windows端使用VSCode和cmake快速构建C++项目

    步骤 在vscode中打开一个空文件夹 xff0c 按Ctrl 43 Shift 43 P调出命令输入界面 xff0c 输入cq或cmake q xff0c 选择CMake Quick Start xff0c 或直接按下回车键 xff1a
  • C++早就过时了?大部分写工程不用C++,学习这个语言就为了竞赛?

    其实腾讯对外发布的 腾讯研发大数据报告 已经披露了2020年C 43 43 仍然是腾讯最受欢迎的语言 在游戏和工具中仍然是主流 xff1a 大部分游戏引擎 如Unreal Source 及中间件 如Havok FMOD xff0c 虽然有些
  • 输出所有request参数

    private void printAllParam HttpServletRequest request Enumeration paramNames 61 request getParameterNames while paramNam
  • java反转字节读取小端(Little Endian)数据

    用c 的BinaryWriter的Write方法向文件里写int时 字节序是小端 即Little Endian 用java的DataInputStream的readInt方法 往往不能读取正确值 可以用Integer的reverseByte
  • C/C++ 类库 开发库 资料

    原文 xff1a C C 43 43 函数库 类库 作者 xff1a Breaker lt breaker zy AT gmail gt C C 43 43 开发库 C C 43 43 Development Library 这里收集一些著
  • java 预申请磁盘空间处理大文件

    熟悉电驴和bt的你可能经常看到这些软件可以在下载文件之初就先在硬盘上建立了一个将要下载的那个文件 xff0c 但其实里面的内容是空的 xff0c 只是预先申请了磁盘空间 xff0c 这样做的好处是可以尽可能的减少磁盘碎片 xff0c 同时可
  • 看我把firefox改造成chrome的样子

    一直很喜欢chrome的主题 xff0c 美观 xff0c 而且足够简介实用 xff0c 标题栏和菜单栏 xff0c 状态栏都干掉了 xff0c 节省了很大的空间 xff0c 尤其是对我这种小屏幕的电脑来说太棒了 昨天把firefox折腾成
  • 关于CMD(win7里)的字体

    先别骂偶 xff0c 但偶不得不首先声明特别挑剔字体是偶最大的洁癖 对windows里的命令提示符也不例外 今天不小心调了一下vim的窗口大小 xff0c 不知怎么搞的越弄越糟糕 xff0c 把cmd里原来的字体都高没有了 xff0c 只剩
  • 我用django的一个感受

    我是个python业余者 xff0c 没有做过python的项目 xff0c 最近自学python xff0c 不过遇到些困惑 xff0c 希望大大们指点 早有听说python是个很好的语言 xff0c 又早有听说python做web最好的
  • new 、 delete 、 malloc 、 free 关系

    1 new delete malloc free 关系 delete 会调用对象的析构函数 和 new 对应 free 只会释放内存 xff0c new 调用构造函数 malloc 与 free 是 C 43 43 C 语言的标准库函数 x
  • 测试Java反射效率

    测试分为3个方面 xff1a 1 实例化效率 xff1b 2 方法调用效率 xff1b 3 成员变量GET调用效率 xff1b 4 成员变量SET调用 测试环境 xff1a Windows 7 Sun Java 1 6 先写好备测试用的类