C#测试对比不同类型的方法调用的性能
一. 测试方法调用形式
1. 实例方法调用
2. 静态方法调用
3. 实例方法反射调用
4. 委托方法的Invoke调用
5. 委托方法的DynamicInvoke调用
6.委托方法的BeginInvoke调用
二. 测试要点
1. 首先要先对测试代码和测试工具的方法进行预热处理,即先调用一次然方法通过JIT编译成本机的代码,防止其对时间的损耗(虽然只有一点点,但是还是有影响的);
2. 关闭电脑上一些运用程序来避免其对我们测试的影响;
三测试工具代码
采用老赵写的性能测试工具,见如下地址的文章:
我采用的代码来自GitHub:
- GitHub
四. 测试代码和测试结果
代码如下:
//循环测试次数
const int iteration = ; //性能计数器
CodeTimer codeTimer = new CodeTimer();
//预热
codeTimer.Initialize(); //过JIT编译,防止在产生本地代码的时候的时间的消耗
Test test = new Test();
test.ShowHelloWorld(null);
Test.ShowHelloWorldStatic(null); object obj = new object(); Console.WriteLine("-------------实例方法调用-------------"); CodeTimerResult result = codeTimer.Time(iteration, () =>
{
test.ShowHelloWorld(obj);
});
Console.WriteLine(result.ToString()); Console.WriteLine("-------------静态方法调用-------------"); result = codeTimer.Time(iteration, () =>
{
Test.ShowHelloWorldStatic(obj);
});
Console.WriteLine(result.ToString()); Console.WriteLine("-------------反射调用-------------"); result = codeTimer.Time(iteration, () =>
{
//调用之前要获得方法
Type type = typeof(Test);
MethodInfo methodInfo = type.GetMethod("ShowHelloWorld");
methodInfo.Invoke(test, new object[] { obj });
}); Console.WriteLine(result.ToString()); Console.WriteLine("-------------委托调用Invoke-------------"); result = codeTimer.Time(iteration, () =>
{
Action<object> action = test.ShowHelloWorld;
action.Invoke(obj);
}); Console.WriteLine(result.ToString()); Console.WriteLine("-------------委托调用DynamicInvoke-------------"); result = codeTimer.Time(iteration, () =>
{
Action<object> action = test.ShowHelloWorld;
action.DynamicInvoke(obj);
}); Console.WriteLine(result.ToString()); Console.WriteLine("-------------异步调用-------------"); result = codeTimer.Time(iteration, () =>
{
Action<object> action = test.ShowHelloWorld;
IAsyncResult ir = action.BeginInvoke(obj, (r) => { }, null);
action.EndInvoke(ir);
}); Console.WriteLine(result.ToString());
运行结果:

五. 结论
性能(好-> 差):静态方法调用 > 实例方法调用 > 委托Invoke调用 > 反射调用 > 委托DynamicInvoke调用 > 异步调用
C#测试对比不同类型的方法调用的性能的更多相关文章
- 【翻译自nikic大神】PHP中原生类型的方法
引言 第一次,翻译别人的文章,用四级英语的水平来翻译~~囧,可能有很多不太恰当的地方,尽管拍砖(有些地方实在想不到恰当的翻译,我同时贴出了原文和自己很low的翻译). 翻译这篇文章用了我3个晚上一个中 ...
- JVM方法调用过程
JVM方法调用过程 重载和重写 同一个类中,如果出现多个名称相同,并且参数类型相同的方法,将无法通过编译.因此,想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同.这种方法上的联系就是重载 ...
- 04 JVM是如何执行方法调用的(下)
虚方法调用 Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用会被编译成 invokeinterface 指令.这两种指令,均属于 Java 虚拟机中的虚 ...
- Jmh测试JDK,CGLIB,JAVASSIST动态代理方式的性能
前言 JDK,CGLIB,JAVASSIST是常用的动态代理方式. JDK动态代理仅能对具有接口的类进行代理. CGLIB动态代理方式的目标类可以没有接口. Javassist是一个开源的分析.编辑和 ...
- 用CIL写程序:从“call vs callvirt”看方法调用
前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...
- .NET面试题解析(04)-类型、方法与继承
系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 做技术是清苦的.一个人,一台机器,相对无言,代码纷飞,bug无情.须梦里挑灯,冥思苦想,肝血暗耗,板凳坐穿 ...
- Hadoop中客户端和服务器端的方法调用过程
1.Java动态代理实例 Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(S ...
- JUnit中测试异常抛出的方法
最近在做TWU关于TDD的作业,对JUnit中测试异常抛出的方法进行了一些学习和思考. 在进行单元测试的时候有的时候需要测试某一方法是否抛出了正确的异常.例如,我有一个方法,里面对一个List进行读取 ...
- Struts2学习---基本配置,action,动态方法调用,action接收参数
首先我们先来直接配置,然后再来讲原理: 第一步:jar包的引入: 我们可以到struts2的官网上下载: http://struts.apache.org/download.cgi#struts251 ...
随机推荐
- Elasticsearch索引按月划分以及获取所有索引数据
项目中数据库根据月份水平划分,由于没有用数据库中间件,没办法一下查询所有订单信息,所有用Elasticsearch做订单检索. Elasticsearch索引和数据库分片同步,也是根据月份来建立索引. ...
- 图解Numpy的tile函数
Numpy的tile(A, reps)函数,就是将原矩阵横向.纵向地复制.tile是瓷砖的意思,顾名思义,这个函数就是把数组像瓷砖一样铺展开来. 举个例子,原矩阵: 横向铺展: 纵向铺展: 横向铺 ...
- 缓存AJAX的请求
在客户端缓存Ajax请求 浏览器可以缓存图片.js文件.css文件,同样浏览器也可以缓存XML Http调用(当然这需要XML Http以get方式发送调用),这种缓存基于URL,当我们发送一个请 ...
- centos7.2安装及管理docker
使用的操作系统是是centos7.2,按照官方的推荐的配置,把linux内核升级到3.8以上.安装步骤如下: 1.升级内核版本(包含aufs)cd /etc/yum.repos.dwget http: ...
- Python笔记:设计模式之状态模式
状态模式可以看做是在运行时改变对象行为的一种方式.状态模式允许对象在其内部状态变化时改变其行为,此时感觉就像对象本身已经改变了一样. 参与者: State接口:State基类,定义不同状态共同需要执行 ...
- ebs oracle YTD期间费用
select PERIOD_NAME, SEGMENT3, SEGMENT3_DESC, sum(case when SEGMENT2 = '1011' then ACCOUNTED_ACCRUAL ...
- [转]JS将图片转为base64编码
本文转自:https://blog.csdn.net/DeMonliuhui/article/details/79731359 1.根据img标签获取base64编码/** * * @param im ...
- SQL Server通过函数把逗号分隔的字符串拆分成数据列表的脚本-干货
CREATE FUNCTION [dbo].[Split](@separator VARCHAR(64)=',',@string NVARCHAR(MAX)) RETURNS @ResultTab ...
- python anaconda 常用操作;conda 命令指南
在使用 python anaconda时,经常会用到很多常用操作,记录下来,方便以后更好地使用: conda: Conda既是一个包管理器又是一个环境管理器.你肯定知道包管理器,它可以帮你发现和查看包 ...
- SSH agent 的使用 - 资料摘录
下面是一些ssh agent的资料简要摘录,网路上的相关的文章已经很多了: ssh 推荐的登录方式是使用私钥登录.但是如果生成私钥的时候,设置了口令(passphrase),每次登录时需要输入口令也很 ...