java与c#的反射性能比较
java与c#都支持反射,但是从网络上搜索两大阵营对于反射的态度,基本上.net开发人员都建议慎用反射,因为会有性能开销;反到是java阵营里好象在大量肆无忌惮的使用反射。于是写了下面的测试代码:
c#版的:

二个project,如上图,Model项目中就只有一个实体类Person,代码如下:
using System; namespace Model
{
public class Person
{
private int Add(object i,object j)
{
return (int)i + (int)j;
}
}
}
然后在一个Console控制台里反射Model项目生成的dll,并调用Person类的Private方法
using System;
using System.Diagnostics;
using System.Reflection; namespace ReflectionStudy
{
class Program
{
static void Main(string[] args)
{
var asm = Assembly.LoadFile(@"R:\Relection\ReflectionStudy\ReflectionStudy\bin\Release\Model.dll");
int i = , j = , limit = ;
Stopwatch watch = new Stopwatch();
watch.Reset();
watch.Start();
for (i = ; i < limit; i++)
{
j = TestReflection(asm, i);
}
watch.Stop();
Console.WriteLine("{0}次反射,平均耗时:{1}毫秒/次", limit, watch.ElapsedMilliseconds / (float)limit);
Console.WriteLine(j);
Console.Read();
} static int TestReflection(Assembly asm, int i)
{
var person = asm.CreateInstance("Model.Person");
var privateMethod = person.GetType().GetMethod("Add", BindingFlags.Instance | BindingFlags.NonPublic);
return (int)privateMethod.Invoke(person, new object[] { i, });
}
}
}
运行的结果:
1000000次反射,平均耗时:0.003184毫秒/次
1000000
Java版:

如上图,同样二个project,model里就一个类Person,代码跟c#版类似:
package jimmy;
public class Person {
private Integer add(Object i,Object j){
return (Integer)i + (Integer)j;
}
}
RelectionTest里引用model生成的jar包,主要代码如下:
package test; import java.lang.reflect.Method;
import java.text.DecimalFormat; public class Program {
/**
* @param args
*/
public static void main(String[] args) {
try {
Class<?> c = Class.forName("jimmy.Person");
Integer i = 0, j = 0, limit = 1000000;
long startMili = System.currentTimeMillis();
for (i = 0; i < limit; i++) {
j = testReflection(c, i);
}
long stopMili = System.currentTimeMillis(); float elapsedTime = (stopMili - startMili) / (float) limit;
DecimalFormat df1=new DecimalFormat("#0.000000"); System.out.println(limit +"次反射,平均耗时:" + df1.format(elapsedTime) + "毫秒/次");
System.out.println(j);
} catch (Exception e) {
e.printStackTrace();
}
} static Integer testReflection(Class<?> c, Integer i) {
try {
Method m = c.getMethod("add", Object.class, Object.class);
return (Integer) m.invoke(c.newInstance(), i, 1);
} catch (Exception e) {
e.printStackTrace();
}
return 0; } }
在同一台机器上的运行结果:
1000000次反射,平均耗时:0.000301毫秒/次
1000000
单就这个示例而言,java的反射效率整整高出了c#10倍,难道是我姿势不对?
java与c#的反射性能比较的更多相关文章
- Java各种反射性能对比
对各种方法实现get方法的性能进行了一个测试. 总共有5个测试,,每个测试都是执行1亿次 1. 直接通过Java的get方法 2.通过高性能的ReflectAsm库进行测试 3.通过Java Clas ...
- 如何利用缓存机制实现JAVA类反射性能提升30倍
一次性能提高30倍的JAVA类反射性能优化实践 文章来源:宜信技术学院 & 宜信支付结算团队技术分享第4期-支付结算部支付研发团队高级工程师陶红<JAVA类反射技术&优化> ...
- 反射那些事儿——Java动态装载和反射技术
一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...
- Java学习:注解,反射,动态编译
狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解 什么是注解 ? Annotat ...
- 品味性能之道<十一>:JAVA中switch和if性能比较
通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- Java中的类反射
一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...
- 针对于Java的35 个代码性能优化总结
针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...
- Java类加载和类反射回顾
今天学习Spring,突然想重新复习一下Java类加载和类反射的.巩固一下底层原理.部分参考了李刚老师的<疯狂Java讲义>和陈雄华.林开雄的<Spring3.x企业应用开发实战&g ...
随机推荐
- Eclipse界面设置与常用技巧
建议使用的透视图--视窗组合 Window→Save perspective as 保存当前透视图设置,便于将来不小心打乱后恢复 恢复的方法:Window→reset perspective 定制 ...
- 4、界面前端设计师要阅读的书籍 - IT软件人员书籍系列文章
前端工程师原来的职位是美工,原来只负责项目的一些简单网页制作,因为项目的需要,升级为前端工程师,这就涉及到JS等代码的编写了.前端工程师这个职位在目前来说算是新兴职位,在未来的几年里也是挺吃香的一个职 ...
- lvm[12446]: Another thread is handling an event. Waiting
在检查一Linux服务器时,发现日志里面有大量"lvm[12446]: Another thread is handling an event. Waiting..." Jul ...
- WEB压力测试
原文地址:WEB压力测试 作者:鸟哥のlinux webbench最多可以模拟3万个并发连接去测试网站的负载能力,个人感觉要比Apache自带的ab压力测试工具好,安装使用也特别方便. 1.适用系统: ...
- 密码校验正则表达式(java 环境)
密码校验需求: 1) 密码控制只能输入字母.数字.特殊符号(~!@#$%^&*()_+[]{}|\;:'",./<>?)2) 长度 6-16 位,必须包括字母.数字.特殊 ...
- 【SQL篇章--基于MySQL5.7--创建用户】
SQL: 创建用户:>=MySQL5.7.6 查看用户: mysql> select user,host,authentication_string from mysql.user; ...
- Linux JDK 安装
1,下载JDK(Linux版) 官网下载:http://www.oracle.com/technetwork/java/javase/downloads/index.html 2, 建立java目录 ...
- 国内Hadoop应用现状
Hadoop在国内主要以互联网公司为主,下面主要介绍大规模使用Hadoop或研究Hadoop的公司. 1. 百度 百度在2006年就关注了Hadoop并开始调研和使用,截止2012年,总的集群规模超过 ...
- vim IDE平台-打造属于自己的配置
vim IDE平台-打造属于自己的配置 一.前言 目前工作环境基本以Linux为主,自然用到VIM也很多,很早就对如何提高VIM的使用效率有所研究,限于时间关系,也没做个系统记录和资料积累,时间久了又 ...
- eclipse乱码解决方法
eclipse之所以会出现乱码问题是因为eclipse编辑器选择的编码规则是可变的.一般默认都是UTF-8或者GBK,当从外部导入的一个工程时,如果该工程的编码方式与eclipse中设置的编码方式不同 ...