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#的反射性能比较的更多相关文章

  1. Java各种反射性能对比

    对各种方法实现get方法的性能进行了一个测试. 总共有5个测试,,每个测试都是执行1亿次 1. 直接通过Java的get方法 2.通过高性能的ReflectAsm库进行测试 3.通过Java Clas ...

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

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

  3. 反射那些事儿——Java动态装载和反射技术

    一直以来反射都是只闻其声,却无法将之使用,近日尽心下来学习下,发现了很多精妙之处. Java动态装载和反射技术 一.类的动态装载 1.Java代码编译和执行的整个过程包含了以下三个重要的机制: ● J ...

  4. Java学习:注解,反射,动态编译

    狂神声明 : 文章均为自己的学习笔记 , 转载一定注明出处 ; 编辑不易 , 防君子不防小人~共勉 ! Java学习:注解,反射,动态编译 Annotation 注解  什么是注解 ? Annotat ...

  5. 品味性能之道<十一>:JAVA中switch和if性能比较

    通常而言大家普遍的认知里switch case的效率高于if else.根据我的理解而言switch的查找类似于二叉树,if则是线性查找.按照此逻辑推理对于对比条件数目大于3时switch更优,并且对 ...

  6. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  7. Java中的类反射

    一.反射的概念 : 反射的概念是由Smith在1982年首次提出的,主要是指程序可以访问.检测和修改它本身状态或行为的一种能力.这一概念的提出很快引发了计算机科学领域关于应用反射性的研究.它首先被程序 ...

  8. 针对于Java的35 个代码性能优化总结

    针对于Java的35 个代码性能优化总结前言代码优化,一个很重要的课题.可能有些人觉得没用,一些细小的地方有什么好修改的,改与不改对于代码的运行效率有什么影响呢?这个问题我是这么考虑的,就像大海里面的 ...

  9. Java类加载和类反射回顾

    今天学习Spring,突然想重新复习一下Java类加载和类反射的.巩固一下底层原理.部分参考了李刚老师的<疯狂Java讲义>和陈雄华.林开雄的<Spring3.x企业应用开发实战&g ...

随机推荐

  1. [转]android笔记--Intent和IntentFilter详解

    Intent用于启动Activity, Service, 以及BroadcastReceiver三种组件, 同时还是组件之间通信的重要媒介. 使用Intent启动组件的优势1, Intent为组件的启 ...

  2. MicroStation VBA 可视化界面

    第十章 可视界面 Private Sub UserForm_Initialize() Dim ViewCen As Point3d Dim MyView As View For Each MyView ...

  3. CMMI能搭救企业吗?

    曾经有朋友跟我提起,他们公司突然有人关注我了,我自然很开心了,看来我名声在外了,哈哈!但我的朋友说,他是这样关注的:“他怎么还在那个公司?他们不是过了5级了吗?我们公司过了级后,EPG(Enginee ...

  4. 小说一下case ~

    case 这个关键词,用的地方不少~大部分的用途都通过以下的方式去应用 SELECT CASE @i END AS 测试1; 测试1 ----------- DECLARE @Hour INT = D ...

  5. Javascript Function()中的降龙十八掌

    原文地址:http://tutorialzine.com/2014/08/what-does-this-function-do/ 下面列出十八个JS function,看你知道这些函数是干嘛用的,你能 ...

  6. 描述Linux系统开机到登陆界面的启动过程(计时2分钟)

    简述: 1.开机BIOS自检 2.MBR引导 3.grub引导菜单 4.加载内核kernel 5.启动init进程 6.读取inittab文件,执行rc.sysinit,rc等脚本 7.启动minge ...

  7. Unity3d Asset Server启动问题

    周末机房停电后asset server无法启动,点击启动出现“asset server could not start server”. 几经周折,找到原来是用户问题,解决办法如下: 1.命令行输入“ ...

  8. Win8 忘记密码 解决办法【在E450c实测有效】

      工具/原料 已经刻录通用PE工具箱的U盘 方法/步骤 1 首先来看一下,问题产生的状况.出现登陆界面,由于密码忘记,怎么输入密码,老是提示密码错误 2 接下来,按住Shift,电脑关机重启,也就是 ...

  9. Linux 下子线程的 pthread_cleanup_push() 和 pthread_cleanup_pop() 研究

    线程退出前可能有一些清理工作,但是这部分代码又不会放到线程主体部分,就需要挂接一个或者几个线程“清洁工”来做这部分事情.需要这对兄弟: #include<pthread.h> void p ...

  10. 【转载】Android Metro风格的Launcher开发系列第二篇

    前言: 各位小伙伴们请原谅我隔了这么久才开始写这一系列的第二篇博客,没办法忙新产品发布,好了废话不说了,先回顾一下:在我的上一篇博客Android Metro风格的Launcher开发系列第一篇写了如 ...