一. 测试方法调用形式

1. 实例方法调用

2. 静态方法调用

3. 实例方法反射调用

4. 委托方法的Invoke调用

5. 委托方法的DynamicInvoke调用

6.委托方法的BeginInvoke调用

二. 测试要点

1. 首先要先对测试代码和测试工具的方法进行预热处理,即先调用一次然方法通过JIT编译成本机的代码,防止其对时间的损耗(虽然只有一点点,但是还是有影响的);

2. 关闭电脑上一些运用程序来避免其对我们测试的影响;

三测试工具代码

采用老赵写的性能测试工具,见如下地址的文章:

  - 《 一个简单的性能计数器:CodeTimer 》

  - 《 对老赵写的简单性能计数器的修改 》

我采用的代码来自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#测试对比不同类型的方法调用的性能的更多相关文章

  1. 【翻译自nikic大神】PHP中原生类型的方法

    引言 第一次,翻译别人的文章,用四级英语的水平来翻译~~囧,可能有很多不太恰当的地方,尽管拍砖(有些地方实在想不到恰当的翻译,我同时贴出了原文和自己很low的翻译). 翻译这篇文章用了我3个晚上一个中 ...

  2. JVM方法调用过程

    JVM方法调用过程 重载和重写 同一个类中,如果出现多个名称相同,并且参数类型相同的方法,将无法通过编译.因此,想要在同一个类中定义名字相同的方法,那么它们的参数类型必须不同.这种方法上的联系就是重载 ...

  3. 04 JVM是如何执行方法调用的(下)

    虚方法调用 Java 里所有非私有实例方法调用都会被编译成 invokevirtual 指令,而接口方法调用会被编译成 invokeinterface 指令.这两种指令,均属于 Java 虚拟机中的虚 ...

  4. Jmh测试JDK,CGLIB,JAVASSIST动态代理方式的性能

    前言 JDK,CGLIB,JAVASSIST是常用的动态代理方式. JDK动态代理仅能对具有接口的类进行代理. CGLIB动态代理方式的目标类可以没有接口. Javassist是一个开源的分析.编辑和 ...

  5. 用CIL写程序:从“call vs callvirt”看方法调用

    前文回顾:<用CIL写程序系列> 前言: 最近的时间都奉献给了加班,距离上一篇文章也有半个多月了.不过在上一篇文章<用CIL写程序:定义一个叫“慕容小匹夫”的类>中,匹夫和各位 ...

  6. .NET面试题解析(04)-类型、方法与继承

      系列文章目录地址: .NET面试题解析(00)-开篇来谈谈面试 & 系列文章索引 做技术是清苦的.一个人,一台机器,相对无言,代码纷飞,bug无情.须梦里挑灯,冥思苦想,肝血暗耗,板凳坐穿 ...

  7. Hadoop中客户端和服务器端的方法调用过程

    1.Java动态代理实例 Java 动态代理一个简单的demo:(用以对比Hadoop中的动态代理) Hello接口: public interface Hello { void sayHello(S ...

  8. JUnit中测试异常抛出的方法

    最近在做TWU关于TDD的作业,对JUnit中测试异常抛出的方法进行了一些学习和思考. 在进行单元测试的时候有的时候需要测试某一方法是否抛出了正确的异常.例如,我有一个方法,里面对一个List进行读取 ...

  9. Struts2学习---基本配置,action,动态方法调用,action接收参数

    首先我们先来直接配置,然后再来讲原理: 第一步:jar包的引入: 我们可以到struts2的官网上下载: http://struts.apache.org/download.cgi#struts251 ...

随机推荐

  1. angularjs中directive指令与component组件有什么区别?

     壹 ❀ 引 我在前面花了两篇博客分别系统化介绍了angularjs中的directive指令与component组件,当然directive也能实现组件这点毋庸置疑.在了解完两者后,即便我们知道co ...

  2. Java之ssh框架spring配置文件配置定时任务

    最近做了一个数据同步功能,要求晚上0点去定时同步数据,这是个老项目框架用的ssh,定时任务基于quartz,废话不多说,下面详细说说相关配置. 在spring的配置文件中: <!-- 0点定时任 ...

  3. Redis入门(一)-Redis简介

    最近几年,Rddis非常的火,受到广大中大型公司,特别是互联网公司的青睐.而作为后端开发,如果你不知道Redis或不会用,没用过,你都不好意思出去找工作.可想而知Redis对于IT行业意义多么重大.对 ...

  4. Jmeter元件——JSON Extractor后置处理器介绍2

    在前段时间将JSON Extractor元件做了个简单的介绍:Jmeter元件——JSON Extractor后置处理器介绍1,今天以一个具体的json,以不同的方式提取数据做个详细的介绍. 一.模拟 ...

  5. TypeScript 装饰器的执行原理

    装饰器本质上提供了对被装饰对象 Property​ Descriptor 的操作,在运行时被调用. 因为对于同一对象来说,可同时运用多个装饰器,然后装饰器中又可对被装饰对象进行任意的修改甚至是替换掉实 ...

  6. C# OpenCVSharp使用SetMouseCallback设置回调方法,报错"向非托管代码传递委托时,托管应用程序必须让这些委托保持活动状态,直到确信不会再次调用它们。"

    一.描述问题 当非托管代码调用托管应用程序的委托的时候,经常会报错“托管调试助手 "CallbackOnCollectedDelegate"   Message=托管调试助手 &q ...

  7. .netcore2.1 JS-SDK 从后台获取微信签名,实现自定义分享标题、描述、图片

    最近项目移动端需要实现微信自定义分享功能,包含分享自定义标题.描述等. 首先到公众号的后台,功能设置里面,添加将要被分享的域名,如图 后端签名算法实现 ,参考腾讯开发者文档https://mp.wei ...

  8. Python Web(一)

    Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.Web框架 1.socket网络编程 架构:C/S 协议:TCP/UDP 传输层 2.Web应用 架构:B/S ...

  9. Cobalt Strike系列教程第四章:文件/进程管理与键盘记录

    Cobalt Strike系列教程分享如约而至,新关注的小伙伴可以先回顾一下前面的内容: Cobalt Strike系列教程第一章:简介与安装 Cobalt Strike系列教程第二章:Beacon详 ...

  10. Android MediaPlayer 在 6.0 以上版本使用倍速播放功能说明

    Android MediaPlayer 在API 23即6.0版本开始支持倍速播放,下面我们来介绍一下如何使用MediaPlayer进行倍速播放. 一.核心接口 MediaPlayer.setPlay ...