一. 测试方法调用形式

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. 关于ASP.NET配置

    字符串加密打开Vs的开发人员命令提示符 //加密web.config文件的连接字符串aspnet_regiis.exe -pef "connectionStrings" " ...

  2. vue路由传参和获取参数

    参考链接 https://router.vuejs.org/zh/guide/essentials/passing-props.html#%E5%B8%83%E5%B0%94%E6%A8%A1%E5% ...

  3. (三十八)c#Winform自定义控件-圆形进度条-HZHControls

    官网 http://www.hzhcontrols.com 前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. GitHub:https://github.com/kww ...

  4. 利用css将英文转为大写或小写

    项目需要在后台接收的字段值为小写,但在页面上显示大写英文,但操作页面之后,最终传给后台的依旧是小写,所以就需要使用css转化一下即可 <li>This.is.a.book,全部转为大写:& ...

  5. 如何用css实现弧度圆角?三角形以及圆形

    用css画矩形圆角 ,需要使用到border-radius这个属性,下图四角圆,代码显示如下:border-radius:60px; width:360px; height:200px; border ...

  6. TensorFlow从1到2(十四)评估器的使用和泰坦尼克号乘客分析

    三种开发模式 使用TensorFlow 2.0完成机器学习一般有三种方式: 使用底层逻辑 这种方式使用Python函数自定义学习模型,把数学公式转化为可执行的程序逻辑.接着在训练循环中,通过tf.Gr ...

  7. private构造器和单例模式

    // hiding/Lunch.java // Demonstrates class access specifiers. Make a class // effectively private wi ...

  8. nodejs+Express中使用mustache模板引擎

    由于公司一个seo项目,需要我协助.此项目他人已经开发大半,由于seo需要,使用了服务器端模板引擎.我项目的后端同事说项目是go语音写的,跑项目麻烦,只给了我template和css等静态文件. 为了 ...

  9. LG2602/BZOJ1833 「ZJOI2010」数字计数 数位DP

    问题描述 LG2602 BZOJ1833 题解 数位\(\mathrm{DP}\)板子题. 注意限制位数.前导零. \([a,b]=[1,b]-[1,a-1]\) \(\mathrm{Code}\) ...

  10. nginx--代理和负载均衡

    nginx代理 nginx的代理分为正向代理和反向代理 正向代理指的是,一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原 ...