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 ...
随机推荐
- HashMap vs TreeMap vs Hashtable vs LinkedHashMap
Map是一个重要的数据结构,本篇文章将介绍如何使用不同的Map,如HashMap,TreeMap,HashTable和LinkedHashMap. Map概览 Java中有四种常见的Map实现,Has ...
- ORACLE 10升级到10.2.0.5 Patch Set遇到的内核参数检测失败问题
在测试ORACLE 10.2.0.4升级到10.2.0.5 Patch Set的过程中,遇到一个内核参数检查失败的问题,具体错误信息如下所示 实验环境: 操作系统:Oracle Linux Ser ...
- 通过mdf ldf文件还原数据库
新建查询,执行如下语句: EXEC sp_attach_db @dbname = 'xxx', /*数据库名称*/ @filename1 = 'D:\数据库备份\预发布\201611241045 测试 ...
- 0008《SQL必知必会》笔记04-子查询、联接与组合查询
1.子查询:就是嵌套的查询,用一个查询的结果作为另一个查询的条件. 比如要列出订购了物品“RGAN01”的所有顾客的ID.姓名和联系人,需要经历以下几步 (1)从orderitems中找出订购了“RG ...
- 不同Framework下StringBuilder和String的性能对比,及不同Framework性能比(附Demo)
本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 文章是哥(mephisto)写的,SourceLink 阅读目录 介绍 环境搭建 测试用例 MSDN说明 ...
- itext 实现pdf打印数字上标和下标
https://kathleen1974.wordpress.com/category/itext-pdf/ In one of my project, we need to give the use ...
- android 导入数据(通讯录)
接着android 中导出数据 一文,下面介绍在android中导入数据的思路: 1.将数据从文本中读取出来 2.封装处理成自己想要的对象或模型 3.将处理好的数据对象插入自己应用的数据库中 4.更新 ...
- 005.TCP--拼接TCP头部IP头部,实现TCP三次握手的第一步(Linux,原始套接字)
一.目的: 自己拼接IP头,TCP头,计算效验和,将生成的报文用原始套接字发送出去. 若使用tcpdump能监听有对方服务器的包回应,则证明TCP报文是正确的! 二.数据结构: TCP首部结构图: s ...
- hdu 4967 Handling the Past
hdu 4967 Handling the Past view code//把时间离散化,维护一个线段(线段l到r的和用sum[l,r]表示),pop的时候就在对应的时间减一,push则相反 //那么 ...
- [转] OpenStack Kilo 更新日志
OpenStack 2015.1.0 (Kilo)更新日志 原文: https://wiki.openstack.org/wiki/ReleaseNotes/Kilo/zh-hans 目录 [隐藏] ...