iptables 基础
2016-01-25 16:09
471 查看
java的反射机制是程序能够在运行时判断任意一个对象所属的类;在运行时构造任意一个类的对象;在运行时判断任意一个类所具有的成员变量和方法;在运行时调用任意一个对象的方法,这些特性使我们只需编写比以前少的多的代码,就可以来完成相同的功能,但是反射带来的多余的性能消耗却是我们需要关注的,性能的消耗点是哪里,这些都需要清楚。
废话就不多说了,直接上测试数据先
以下就是对一个set方法的普通调用,反射调用,获取set反射方法执行时间的对比
运行环境1: cpu:intel i5-3210 2.5GHz 内存 :8G JDK1.6 x64 操作系统:win7
运行环境 2
手机:cpu: 高通 1.4G 单核 内存:850M(除去操作系统,其他应用,剩下还没100M %>_<%)操作系统:android 2.3.4
再来就是测试源码了
准备好这些,那么就开始分析数据了
第一个分析点:普通方法和反射的数据对比,从以上两个环境的数据的平均值来看,PC的调用时间差距是4倍左右, 手机的的调用时间差距是15倍左右(平均后的数据,大概啦); 虽然有这样的差距,但是PC端在10万次的调用中,仅仅耗时53ms,在测试例子中的方法调用已经排除了对象创建的消耗,现实场景中加上多余对象操作的消耗,一秒完全可以跑完(除非里面真的写了耗时的操作),在手机端上,10万次的计算,也才815ms,实际场景中手机端一次操作进行10万次的反射调用,几乎没有!在考虑的反射带来的方便和它的性能消耗,完全可以忽略这些消耗啦!
第二个分析点:获取反射方法,看看以上的数据,其消耗的时间是执行反射方法的10倍,随着执行次数的增加,呈几何递增啊!而在自己看来,获取反射方法就是获取类的信息,类的信息在运行时不会变化,完全没有必要重复取反射方法,可以设计一套缓存的机制,将这些类的信息缓存起来,达到提高效率的目的,这样带来的内存消耗当然是必不可少的,但是怎么把握这个平衡点就看自己了。
第三点分析点:内存问题!使用反射比普通的调用,其实就多了反射相关对象的创建的内存消耗,不过与其带来的便利相比,是可以接受的。(个人感觉这些对象其实占不了多大内存啦,纯属个人意见,勿喷)
总结:通过以上的分析,个人觉得,无论的PC还是移动,反射完全可以随意使用,但是对使用反射的过程中做相应的优化还是必须的
(以上皆是个人意见,若有错误,欢迎指正)
废话就不多说了,直接上测试数据先
以下就是对一个set方法的普通调用,反射调用,获取set反射方法执行时间的对比
运行环境1: cpu:intel i5-3210 2.5GHz 内存 :8G JDK1.6 x64 操作系统:win7
运行环境 2
手机:cpu: 高通 1.4G 单核 内存:850M(除去操作系统,其他应用,剩下还没100M %>_<%)操作系统:android 2.3.4
再来就是测试源码了
package com.example.android_test;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.Date;
public class Test { public static long times = 1000; public static final String str="111"; /** * @param args * @throws InvocationTargetException * @throws IllegalAccessException * @throws NoSuchMethodException * @throws IllegalArgumentException * @throws SecurityException */ public static void main(String[] args) throws SecurityException, IllegalArgumentException, NoSuchMethodException, IllegalAccessException, InvocationTargetException { normal(); reflect(); reflectMethod(); }
/** * 普通方法 */ public static void normal() { Demo demo = new Demo(); Date dateS = new Date(); printUsedMemory(); for (int i = 0; i < times ; i++) { demo.setStr(str); } printUsedMemory(); Date dateE = new Date(); long time = dateE.getTime() - dateS.getTime(); System.out.println(time + "毫秒"); }
/** * 反射方法 * @throws SecurityException * @throws NoSuchMethodException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InvocationTargetException */ public static void reflect() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Demo demo = new Demo(); Date dateS = new Date(); Method m; m = Demo.class.getMethod("setStr", String.class); printUsedMemory(); for (int i = 0; i < times; i++) { m.invoke(demo, str); } printUsedMemory(); Date dateE = new Date();
long time = dateE.getTime() - dateS.getTime(); System.out.println(time + "毫秒");
} /** * 获取反射方法 * @throws SecurityException * @throws NoSuchMethodException * @throws IllegalArgumentException * @throws IllegalAccessException * @throws InvocationTargetException */ public static void reflectMethod() throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException { Demo demo = new Demo(); Date dateS = new Date(); Method m; printUsedMemory(); for (int i = 0; i < times; i++) { m = Demo.class.getMethod("setStr", String.class); } printUsedMemory(); Date dateE = new Date();
long time = dateE.getTime() - dateS.getTime(); System.out.println(time + "毫秒");
}
public static long printUsedMemory() { long totalMemory = Runtime.getRuntime().totalMemory(); long freeMemory = Runtime.getRuntime().freeMemory(); long usedMemory = totalMemory - freeMemory; System.out.println("虚拟机已用内存:" + usedMemory + " Byte|" + usedMemory / 1024 + " KB"); return usedMemory; } }
准备好这些,那么就开始分析数据了
第一个分析点:普通方法和反射的数据对比,从以上两个环境的数据的平均值来看,PC的调用时间差距是4倍左右, 手机的的调用时间差距是15倍左右(平均后的数据,大概啦); 虽然有这样的差距,但是PC端在10万次的调用中,仅仅耗时53ms,在测试例子中的方法调用已经排除了对象创建的消耗,现实场景中加上多余对象操作的消耗,一秒完全可以跑完(除非里面真的写了耗时的操作),在手机端上,10万次的计算,也才815ms,实际场景中手机端一次操作进行10万次的反射调用,几乎没有!在考虑的反射带来的方便和它的性能消耗,完全可以忽略这些消耗啦!
第二个分析点:获取反射方法,看看以上的数据,其消耗的时间是执行反射方法的10倍,随着执行次数的增加,呈几何递增啊!而在自己看来,获取反射方法就是获取类的信息,类的信息在运行时不会变化,完全没有必要重复取反射方法,可以设计一套缓存的机制,将这些类的信息缓存起来,达到提高效率的目的,这样带来的内存消耗当然是必不可少的,但是怎么把握这个平衡点就看自己了。
第三点分析点:内存问题!使用反射比普通的调用,其实就多了反射相关对象的创建的内存消耗,不过与其带来的便利相比,是可以接受的。(个人感觉这些对象其实占不了多大内存啦,纯属个人意见,勿喷)
总结:通过以上的分析,个人觉得,无论的PC还是移动,反射完全可以随意使用,但是对使用反射的过程中做相应的优化还是必须的
(以上皆是个人意见,若有错误,欢迎指正)
相关文章推荐
- 详解C++编程中向函数传递引用参数的用法
- Unity3D NGUI 制作Tabs
- python黑魔法之编码转换
- jquery遍历时长度为空
- apache如何配置多个虚拟目录
- 高性能计算:基础线性代数子程序CBLAS
- HILBERT transform
- CDH5 Integration with Eclipse
- js正则表达式语法
- uva116
- RAD Studio 10 自带Demo代码汇总说明
- WebRTC 工作流程
- 检测App内存泄露--LeakCanary工具
- 主元素问题
- 【箭扣观点】移动开发服务之“元素2015”
- StringUtils
- sqlserver 删除数据库日志
- 静态页生成
- PHP编译configure时常见错误
- Linux下修改swap的大小