java反射效率对比_Java反射三种方式的效率对比
1 使用field
long start = System.nanoTime();
Field[] fields = CallCount.class.getDeclaredFields();
for (String str : dateList) {
boolean exist = false;
for (Field field : fields){
field.setAccessible(true);
if (field.getName().endsWith(str)) {
int value = 0;
for (CallCount callCount : callCountList) {
value += (Integer)field.get(callCount);
}
resultList.add(value);
exist = true;
break;
}
}
if (!exist) {
resultList.add(0);
}
}
long end = System.nanoTime();
log.info("old call cost :" + (end-start));
2 使用 org.apache.commons.beanutils.BeanUtils来获取属性
long start = System.nanoTime();
for (String str : dateList) {
Integer value = getMinuteAccessCount(str, callCountList);
resultList.add(value);
}
long end = System.nanoTime();
log.info("new call cost :" + (end-start));
private Integer getMinuteAccessCount(String minute, List callCountList) {
Integer result = 0;
String propertyName = "logMinute" + minute;
for (CallCount callCount : callCountList) {
int value = 0;
try {
value = Integer.valueOf(BeanUtils.getProperty(callCount, propertyName));
} catch (NumberFormatException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
result += value;
}
return result;
}
3 使用java.lang.reflect.Method获取值
long start = System.nanoTime();
for (String str : dateList) {
Integer value = getMinuteAccessCount(str, callCountList);
resultList.add(value);
}
long end = System.nanoTime();
log.info("new call cost :" + (end-start));
private Integer getMinuteAccessCount(String minute, List callCountList) {
Integer result = 0;
for (CallCount callCount : callCountList) {
int value = 0;
try {
Method method = callCount.getClass().getDeclaredMethod("getLogMinute"+minute);
Object obj = method.invoke(callCount);
value = (Integer)obj;
} catch (NumberFormatException | IllegalAccessException | InvocationTargetException | NoSuchMethodException e) {
e.printStackTrace();
}
result += value;
}
return result;
}
4 耗时对比,在使用相同的查询条件,相同的数据的情况下。通过实验得到以下两组数据(耗时/纳秒)
1 old call cost :517599
1 old call cost :347916
1 old call cost :337312
1 old call cost :177893
1 old call cost :131709
1 old call cost :82789
1 old call cost :63973
3 new call cost :925383
3 new call cost :794016
3 new call cost :912382
1 old call cost :755016
1 old call cost :365364
1 old call cost :231944
1 old call cost :123498
1 old call cost :103315
1 old call cost :92025
1 old call cost :81762
2 new call cost :139741338
2 new call cost :3387140
2 new call cost :2230497
2 new call cost :9215854
2 new call cost :2313970
2 new call cost :1549374
2 new call cost :1884291
2 new call cost :1100880
2 new call cost :1488138
每组数据前的数字代表之前取值的方式。
由数据对比可以看出,耗时最小的,始终是方式1,并且方式1在多次调用时,耗时是逐步减少的,可能是有缓存机制。
耗时第二少的是方式3,耗时最多的是方式2.
5 解析
方式1,采用了最基本的java反射方式,使用Filed,循环bean的Field,得到Object,再转换为Integer类型。 方式2,采用了看似最简洁的BeanUitls,根据属性名,获取属性值。这样最耗时。 方式3,采用了获取bean的Method,然后invoke的方式来获取值。
java反射效率对比_Java反射三种方式的效率对比相关推荐
- JAVA解决生产消费者_Java常用三种方式解决生产者消费者问题(详细)
package test; /** * Synchronized 版本解决生产者消费者 * wait() / notify()方法 */ import java.util.LinkedList; im ...
- 读取Java文件到byte数组的三种方式及Java文件操作大全(包括文件加密,String加密)
读取Java文件到byte数组的三种方式 package zs;import java.io.BufferedInputStream; import java.io.ByteArrayOutputSt ...
- java的如何创建js_[Java教程]JS创建事件的三种方式(实例)
[Java教程]JS创建事件的三种方式(实例) 0 2016-05-11 14:00:16 1.普通的定义方式 οnclick="Sfont=prompt('请在文本框中输入红色','红色' ...
- 三种方式细胞评分对比
三种方式细胞评分对比 library(patchwork) library(ggplot2) library(ggalluvial) library(svglite) library(Seurat) ...
- Java生成唯一标识码的三种方式
Java生成唯一标识码的三种方式 前言 我们经常会遇到这样的场景,需要生成一个唯一的序列号来表明某一个数据的唯一性,在单节点的应用中我们可以简单地使用一个自增的整型来实现实现,但是在分布式情况下这个方 ...
- 详解C#实例化对象的三种方式及性能对比
前言 做项目过程中有个需求要实例化两万个对象并添加到List 中,这个过程大概需要1min才能加载完(传参较多),于是开启了代码优化之旅,再此记录. 首先想到的是可能实例化比较耗时,于是开始对每种实例 ...
- java反射获取实体类_java 反射获取类对象的三种方式
Java反射经常用到的就是获取对象中的属性,那么Java获取类对象就是必不可少的啦! Java实体类: public class ReflexModel { private String code; ...
- 【Java】 数组转 List 的三种方式及对比
本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一. (最高效) 通过集合工具类Collections.addAll()方法,支持增删 ...
- java源代码实例倒计时_Java倒计时三种实现方式代码实例
写完js倒计时,突然想用java实现倒计时,写了三种实现方式 一:设置时长的倒计时: 二:设置时间戳的倒计时: 三:使用java.util.Timer类实现的时间戳倒计时 代码如下: package ...
- 面试题,反射创建类实例的三种方式是什么
1.获得Class:主要有三种方法: (1)Object-->getClass (2)任何数据类型(包括基本的数据类型)都有一个"静态"的class属性 (3)通过class ...
最新文章
- .NET Core 3.0 Preview 6中对ASP.NET Core和Blazor的更新
- opencv 的特征提取算子SIFT/ORB/SURF
- pythonlbp纹理提取_Python + OpenCV 实现LBP特征提取的示例代码
- java lambda 多个参数_Java Lambda行为参数化
- 一旦有辞职念头就干不长了吗_如何理性而高效地辞职?
- 手机型号大全_双十一高价位华为手机推荐,2020年哪款更值得入手
- linux发送邮件 脚本,linux脚本发送邮件 shell发送邮件(使用 msmtp+mutt+shell来实现)
- 计算机硬件工程师主要干什么,计算机硬件工程师主要学习什么内容
- BZOJ3654 : 图样图森破
- linux定时对准时间,Linux校对时间
- 职高学计算机可以考的大学名单,职高可以考的大学有哪些
- Python之父愤然退位:再也无法忍受他们鄙视我的意见
- QML地图简介(1)
- c语言学生管理系统中人数,python下学生管理系统:从文件中读取30位学生的信息(含邮箱),并实现简单的增、删、查找、统计(邮箱使用人数)。---附程序哦!...
- 倍福TwinCAT(贝福Beckhoff)应用教程12.2 TwinCAT控制松下伺服 NC初步
- line android 英文版,line tv国际版
- php+b2b2c+商城,PHP源码:SHOPNC b2b2c电商平台系统,im+结算补丁+商城专题页插件
- 产业园区招商策略“ 新思路 ”
- 合作式智能运输系统-车用通信系统应用层及应用数据交互标准
- Nginx与Tomcat负载均衡
热门文章
- 跨国实时网络调度系统设计
- LiveVideoStackCon 2018公布优秀出品人与讲师
- C语言文件操作 fopen, fclose, mkdir(打开关闭文件,建文件夹,判断文件是否存在可读或可写)
- TensorFlow文件操作
- 现代c++之线程本地存储thread_local
- leetcode 239. Sliding Window Maximum | 239. 滑动窗口最大值(单调栈,窗口内最大最小值更新结构)
- JVM系列之:对象的锁状态和同步
- java中functional interface的分类和使用
- Spring Boot中的Properties
- 浅谈最小生成树的算法思路(一)Prim算法