专栏首页菩提树下的杨过java与c#的反射性能比较

java与c#的反射性能比较

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

c#版的:

二个project,如上图,Model项目中就只有一个实体类Person,代码如下:

 1 using System;
 2 
 3 namespace Model
 4 {
 5     public class Person
 6     {
 7         private int Add(object i,object j)
 8         {
 9             return (int)i + (int)j;
10         }
11     }
12 }

然后在一个Console控制台里反射Model项目生成的dll,并调用Person类的Private方法

 1 using System;
 2 using System.Diagnostics;
 3 using System.Reflection;
 4 
 5 namespace ReflectionStudy
 6 {
 7     class Program
 8     {
 9         static void Main(string[] args)
10         {
11             var asm = Assembly.LoadFile(@"R:\Relection\ReflectionStudy\ReflectionStudy\bin\Release\Model.dll");
12             int i = 0, j = 0, limit = 1000000;
13             Stopwatch watch = new Stopwatch();
14             watch.Reset();
15             watch.Start();
16             for (i = 0; i < limit; i++)
17             {
18                 j = TestReflection(asm, i);
19             }
20             watch.Stop();
21             Console.WriteLine("{0}次反射,平均耗时:{1}毫秒/次", limit, watch.ElapsedMilliseconds / (float)limit);
22             Console.WriteLine(j);
23             Console.Read();
24         }
25 
26         static int TestReflection(Assembly asm, int i)
27         {
28             var person = asm.CreateInstance("Model.Person");
29             var privateMethod = person.GetType().GetMethod("Add", BindingFlags.Instance | BindingFlags.NonPublic);
30             return (int)privateMethod.Invoke(person, new object[] { i, 1 });
31         }
32     }
33 }

运行的结果: 1000000次反射,平均耗时:0.003184毫秒/次 1000000

Java版:

如上图,同样二个project,model里就一个类Person,代码跟c#版类似:

1 package jimmy;
2 
3 public class Person {
4     private Integer add(Object i,Object j){
5         return (Integer)i + (Integer)j;        
6     } 
7 }

RelectionTest里引用model生成的jar包,主要代码如下:

 1 package test;
 2 
 3 import java.lang.reflect.Method;
 4 import java.text.DecimalFormat;
 5 
 6 public class Program {
 7     /**
 8      * @param args
 9      */
10     public static void main(String[] args) {
11         try {
12             Class<?> c = Class.forName("jimmy.Person");
13             Integer i = 0, j = 0, limit = 1000000;
14             long startMili = System.currentTimeMillis();
15             for (i = 0; i < limit; i++) {
16                 j = testReflection(c, i);
17             }
18             long stopMili = System.currentTimeMillis();
19             
20             float elapsedTime = (stopMili - startMili) / (float) limit;
21             DecimalFormat df1=new DecimalFormat("#0.000000");  
22 
23             System.out.println(limit +"次反射,平均耗时:" + df1.format(elapsedTime) + "毫秒/次");
24             System.out.println(j);
25         } catch (Exception e) {
26             e.printStackTrace();
27         }
28     }
29 
30     static Integer testReflection(Class<?> c, Integer i) {
31         try {
32             Method m = c.getMethod("add", Object.class, Object.class);
33             return (Integer) m.invoke(c.newInstance(), i, 1);
34         } catch (Exception e) {
35             e.printStackTrace();
36         }
37         return 0;
38 
39     }
40 
41 }

在同一台机器上的运行结果: 1000000次反射,平均耗时:0.000301毫秒/次 1000000

单就这个示例而言,java的反射效率整整高出了c#10倍,难道是我姿势不对?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 算法练习(4)-数组去重合并

    这是日常工程中,经常会遇到的场景,拿到2个list,里面有重复元素,要求去重合并最终排序输出。

    菩提树下的杨过
  • ArraySegment<T>泛型结构示例

    以下代码利用ArrarSegment泛型结构,从int数组arr中取出arr[2]到arr[5] using System; using System.Col...

    菩提树下的杨过
  • silverlight:如何在图片上挖个洞?

    一、不写代码的方法:用Blend 看图说话: 这是待处理的图片win7 ? 在win7上,画一个矩形,再用钢笔随便画个封闭的path ? 将矩形与path合...

    菩提树下的杨过
  • 康托展开总结

    这是一个九宫格,里面只有1到9这9个数字。有一些题目涉及到八数码问题,也就是九宫格问题。在九宫格里我们自然想到用广搜去解决一些问题。可是广搜的状态怎么表示呢? ...

    ShenduCC
  • 【LeetCode 136】 关关的刷题日记34 Intersection of Two Arrays II

    关关的刷题日记34 – Leetcode 350. Intersection of Two Arrays II 题目 Given two arrays, wri...

    WZEARW
  • Android Rxjava :最简单&全面背压讲解 (Flowable)

    阅读本文需要对Rxjava了解,如果还没有了解或者使用过Rxjava的兄die们,推荐观看 Android Rxjava:图解不一样的诠释 进行学习。

    Android技术干货分享
  • Integer、new Integer() 和 int 比较的面试题

    https://www.cnblogs.com/cxxjohnson/p/10504840.html

    java思维导图
  • C++快速排序原理深究优化

    前面写过一篇关于归并和快排的文章《归并快排算法比较及求第K大元素》,但文中实现的快排算法,在某些极端情况下时间复杂度会退化到 O(n2),效率将是无法接受的。本...

    evenleo
  • 异步方式访问网页

    采用BackgroundWorker,在后台执行程序,往往比开新线程更简单和更加安全。 简单的使用方法 System.ComponentModel.Backgr...

    用户1075292
  • 奇怪的Java题:为什么128 == 128返回为false,而127 == 127会返回为true?

    奇怪的Java题:为什么128 == 128返回为false,而127 == 127会返回为true?

    互扯程序

扫码关注云+社区

领取腾讯云代金券