java与c#的反射性能比较
时间:2022-04-23
本文章向大家介绍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:RelectionReflectionStudyReflectionStudybinReleaseModel.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倍,难道是我姿势不对?
- CSS实现按钮的两张图片的同步出现
- 完整部署CentOS7.2+OpenStack+kvm 云平台环境(6)--在线调整虚拟机的大小
- 关于vb中的容器
- 关于vb中的容器
- Mysql数据库之Binlog日志使用总结
- 揭秘新人机大战柯洁对手天壤 AI排名已力压Deepzen
- 一路走到java工程师,java都快出java9了,到底该如何学java?
- 网站发布合并bll问题的解决
- 痛并快乐着:浅谈大数据时代的分布式存储架构
- linux运维中的命令梳理(四)
- linux运维中的命令梳理(三)
- 轻松水印-批量提取exif信息加水印的工具
- Enterprise Library 4.1学习笔记7----缓存应用程序块之SqlDependency
- linux运维中的命令梳理(一)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- PHP将数组存入数据库中的四种方式
- 序列化与json性能评测
- js内存泄漏常见的四种情况(From LeuisKen)
- 「R」Rprofile:R 全局设置
- Jmetal Problem和Problem Set的变量范围
- 简单工厂、工厂方法、抽象工厂的比较与分析
- 用一张组织架构图说清楚类和对象
- 一起来学matlab-matlab学习笔记8 基本绘图命令_3 特殊图形绘制
- 看了这个有趣的例子,你就秒懂多线程同步了
- IDA7.0 配置内核调试,双机调试
- ViewPager2与Fragment
- SpringBoot整合SpringSecurity实现JWT认证
- 用Python爬取股票数据,绘制K线和均线并用机器学习预测股价(来自我出的书)
- 用非常硬核的JAVA序列化手段实现对象流的持久化保存
- 微信小程序语音同步智能识别的实现案例