java与c#的反射性能比较

简介: java与c#都支持反射,但是从网络上搜索两大阵营对于反射的态度,基本上.net开发人员都建议慎用反射,因为会有性能开销;反到是java阵营里好象在大量肆无忌惮的使用反射。于是写了下面的测试代码: c#版的: 二个project,如上图,Model项目中就只有一个实体类Person,代码如下...

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 }
View Code

然后在一个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 }
View Code

运行的结果:
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 }
View Code

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 }
View Code

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

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

目录
相关文章
|
21天前
|
缓存 算法 Java
Java 实现的局域网管控软件的性能调优
局域网管控软件在企业网络管理中至关重要,但随着网络规模扩大和功能需求增加,其性能可能受影响。文章分析了数据处理效率低下、网络通信延迟和资源占用过高等性能瓶颈,并提出了使用缓存、优化算法、NIO库及合理管理线程池等调优措施,最终通过性能测试验证了优化效果,显著提升了软件性能。
31 1
|
12天前
|
Java 数据库连接 数据库
优化之路:Java连接池技术助力数据库性能飞跃
在Java应用开发中,数据库操作常成为性能瓶颈。频繁的数据库连接建立和断开增加了系统开销,导致性能下降。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接,显著减少连接开销,提升系统性能。文章详细介绍了连接池的优势、选择标准、使用方法及优化策略,帮助开发者实现数据库性能的飞跃。
20 4
|
10天前
|
Java 数据库连接 数据库
深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能
在Java应用开发中,数据库操作常成为性能瓶颈。本文通过问题解答形式,深入探讨Java连接池技术如何通过复用数据库连接、减少连接建立和断开的开销,从而显著提升系统性能。文章介绍了连接池的优势、选择和使用方法,以及优化配置的技巧。
14 1
|
17天前
|
存储 缓存 算法
提高 Java 数组性能的方法
【10月更文挑战第19天】深入探讨了提高 Java 数组性能的多种方法。通过合理运用这些策略,我们可以在处理数组时获得更好的性能表现,提升程序的运行效率。
17 2
|
16天前
|
存储 Java
[Java]反射
本文详细介绍了Java反射机制的基本概念、使用方法及其注意事项。首先解释了反射的定义和类加载过程,接着通过具体示例展示了如何使用反射获取和操作类的构造方法、方法和变量。文章还讨论了反射在类加载、内部类、父类成员访问等方面的特殊行为,并提供了通过反射跳过泛型检查的示例。最后,简要介绍了字面量和符号引用的概念。全文旨在帮助读者深入理解反射机制及其应用场景。
12 0
[Java]反射
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
377 37
|
2月前
|
安全 Java 索引
Java——反射&枚举
本文介绍了Java反射机制及其应用,包括获取Class对象、构造方法、成员变量和成员方法。反射允许在运行时动态操作类和对象,例如创建对象、调用方法和访问字段。文章详细解释了不同方法的使用方式及其注意事项,并展示了如何通过反射获取类的各种信息。此外,还介绍了枚举类型的特点和使用方法,包括枚举的构造方法及其在反射中的特殊处理。
60 9
Java——反射&枚举
|
27天前
|
安全 Java 测试技术
🌟Java零基础-反射:从入门到精通
【10月更文挑战第4天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
23 2
|
1月前
|
缓存 Java 数据库连接
使用 NCache 将 Java 微服务扩展到极致性能
使用 NCache 将 Java 微服务扩展到极致性能
26 8
|
2月前
|
缓存 Java 应用服务中间件
Java虚拟线程探究与性能解析
本文主要介绍了阿里云在Java-虚拟-线程任务中的新进展和技术细节。
下一篇
无影云桌面