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 ...
随机推荐
- adb devices无法连接mumu模拟器
解决方案: 如果你的android环境能够直接访问 adb 的相关指令.只需要把mumu模拟器打开 然后打开cmd -> 输入 adb connect 127.0.0.1:7555 就能直接连上 ...
- 一起学Android之Animation
本文以一个简单的小例子,简述在Android开发中,动画的简单应用,仅供学习分享使用. 概述 android提供了各种强大的apis,用于将动画应用到ui元素中,来丰富应用程序的功能和应用. 动画分类 ...
- C# 重置IE安全等级
打开IE设置-安全 dynamic shellObject = Interaction.CreateObject("WScript.Shell", ""); / ...
- url编码本质
url编码本质 其实url本质就是将中文字符串进行utf8编码,然后得到编码后的对象转换字符串去掉开头的b'以及末尾的',然后再将\x转换成%,再将里面内容x变成e最后将字符串小写变成大写 举例 #拿 ...
- flutter 打包apk
打包的具体操作,可以参照官网,只是官网没有那么细 1.修改AndroidManifest.xml 2.构建配置 可以跳过 3.构建签名 4.创建 key.properties 5.配置混淆 6.修改 ...
- Windows应急日志常用的几个事件ID
Windows应急日志常用的几个事件ID点击站内没有搜索到,可能搜索姿势不对,发一下吧,应急时可能会用到,根据日志时间点判断入侵 日志路径:C:\Windows\System32\winevt\Log ...
- Java中的“scanf()、cin()、input()"
最近在写一个Java程序时遇到一个问题,就是如何在Java里面输入数值,又叫做获取键盘输入值. 因为c语言里面有scanf(),C++里面有cin(),python里面有input().Java里面有 ...
- vs code 运行 Django 怎么修改端口
1.具体操作步骤如下 默认情况下,通过 python manage.py runserver 命令行模式默认打开是 8000 端口,如下图所示: 在浏览器预览效果如下: 为了防止端口冲突,我们一般会修 ...
- django之ORM字段及参数
目录 ORM字段及参数 orm常用字段 字段合集 自定义char字段 字段参数 外键字段的参数 ORM字段及参数 orm常用字段 字段名 说明 AutoField 如果自己没有定义主键id,djang ...
- Java使用FeignClient发送HTTP 请求
使用FeignClient发送HTTP请求1.添加依赖<!-- spring cloud jar--><dependency> <groupId>org.sprin ...