用BenchmarkDotNet看Property

属性——Property,由get,set访问器组成,这是C#使用度比较高的类成员。今天分几组对比测试,来看一下使用Property的性能。

被测试对象:

public class MyClass
{private string _myProperty1 = DateTime.Now.ToString();public string MyProperty1 { get { return _myProperty1; } }public string MyProperty2 { get { return DateTime.Now.ToString(); } }public string MyMethod(){return DateTime.Now.ToString();}
}

调用测试方法统一如下:

BenchmarkRunner.Run<TestProperty>();

第一组:构造实例化对象和方法内实例化对象,调用属性差多少

[MemoryDiagnoser]
public class TestProperty
{private readonly MyClass _myClass;public TestProperty(){_myClass = new MyClass();}[Benchmark]public string PropertyA(){return _myClass.MyProperty1;}[Benchmark]public string PropertyAExt(){var myClass = new MyClass();return myClass.MyProperty1;}
}

结果:差别很大,因为毕竟有一个new的过程,需要开销,同时也能理解,提交初始尽量初始化,多次调用时就开销变少了。

第二组:比较用字段属性和无字段属性的差别

[MemoryDiagnoser]
public class TestProperty
{private readonly MyClass _myClass;public TestProperty(){_myClass = new MyClass();}[Benchmark]public string PropertyA(){return _myClass.MyProperty1;}[Benchmark]public string PropertyAExt(){var myClass = new MyClass();return myClass.MyProperty1;}[Benchmark]public string PropertyB(){return _myClass.MyProperty2;}    [Benchmark]public string PropertyBExt(){var myClass = new MyClass();return myClass.MyProperty2;}
}

结果:这组结果显示,有字段的属性更快,因为当类实体化时,字段的值已经初始化完成,所以PropertyA要好于PropertyB,关于PropertyBExt,初始化字段+实例化对象,都占了300ns。


第三组:用反射访问属性与正常访问属性对比

[MemoryDiagnoser]
public class TestProperty
{private readonly MyClass _myClass;private readonly PropertyInfo _proinfo;public TestProperty(){_myClass = new MyClass();_proinfo = _myClass.GetType().GetProperty("MyProperty");}[Benchmark]public string PropertyA(){return _myClass.MyProperty1;}[Benchmark]public string PropertyAExt(){var myClass = new MyClass();return myClass.MyProperty1;}[Benchmark]public string PropertyB(){return _proinfo.GetValue(_myClass).ToString();}[Benchmark]public string PropertyBExt(){var myClass = new MyClass();var proinfo = myClass.GetType().GetProperty("MyProperty");return proinfo.GetValue(myClass).ToString();}
}

结果:反射调用肯定要比正常调用差一些,无可厚非,仅供参考

第四组:重点看一下代理的性能比较

[MemoryDiagnoser]
public class TestProperty
{private readonly MyClass _myClass;private readonly PropertyInfo _proinfo;private readonly Func<MyClass, string> _delegate;public TestProperty(){_myClass = new MyClass();_proinfo = _myClass.GetType().GetProperty("MyProperty1");_delegate = (Func<MyClass, string>)Delegate.CreateDelegate(typeof(Func<MyClass, string>), _proinfo.GetGetMethod(true)!);}[Benchmark]public string PropertyA(){return _myClass.MyProperty1;}[Benchmark]public string PropertyAExt(){var myClass = new MyClass();return myClass.MyProperty1;}[Benchmark]public string PropertyB(){return _proinfo.GetValue(_myClass).ToString();}[Benchmark]public string PropertyBExt(){var myClass = new MyClass();var proinfo = myClass.GetType().GetProperty("MyProperty1");return proinfo.GetValue(myClass).ToString();}[Benchmark]public string PropertyC(){var value = _delegate(_myClass);return value;}[Benchmark]public string PropertyCExt(){var myClass = new MyClass();var proinfo = myClass.GetType().GetProperty("MyProperty1");var dele = (Func<MyClass, string>)Delegate.CreateDelegate(typeof(Func<MyClass, string>), proinfo.GetGetMethod(true)!);return dele(_myClass);}
}

结果:PropertyC代理方式与PropertyA接近,看来在其他场景中可以参考使用。但PropertyCExt要开销的多的多,看来这是提前在实例化时做了工作,所以在代理调用时才开销变少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301554.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盘点2019年最有钱的爸爸们

全世界只有3.14 % 的人关注了数据与算法之美纽约时间3月5日&#xff0c;又到了一年一度的大佬炫富时间了&#xff0c;福布斯发布第33期2019年度全球亿万富豪榜&#xff0c;全世界最有钱的人都在这了。第33期福布斯全球亿万富豪榜TOP20 ↓据统计&#xff0c;本次评选一共有2153位…

android拖拽 字体变形,字体变形的几种方法与技巧

原标题&#xff1a;字体变形的几种方法与技巧替换法是在统一形态的文字元素加入另类不同的图形元素或文字元素。 其本质是根据文字的内容意思&#xff0c;用某一形象替代字体的某个部分或某一笔画&#xff0c;这些形象或写实或夸张。将文字的局部替换&#xff0c;是文字的内涵外…

ML.NET Cookbook:(18)如何在文本数据上训练模型?

一般来说&#xff0c;所有的ML.NET学习器都希望这些特征是一个浮点向量。因此&#xff0c;如果您的一些数据不是一个float&#xff0c;您需要将其转换为float。如果我们想学习文本数据&#xff0c;我们需要从文本中“提取特征”。NLP&#xff08;自然语言处理&#xff09;的整个…

每日一笑 | 终于知道为什么胖了之后气质会垮了

全世界只有3.14 % 的人关注了数据与算法之美&#xff08;图片来源于网络&#xff0c;侵权删&#xff09;

android led闪烁功能,如何在Android应用层中制作一个LED指示灯效果

如何在Android应用层中制作一个LED指示灯效果发布时间&#xff1a;2020-12-08 16:12:59来源&#xff1a;亿速云阅读&#xff1a;86作者&#xff1a;Leah本篇文章给大家分享的是有关如何在Android应用层中制作一个LED指示灯效果&#xff0c;小编觉得挺实用的&#xff0c;因此分享…

人工智能时代,学好数学很重要!

随着科技的快速发展&#xff0c;人工智能的重要性日渐显现。而数学知识蕴含着处理智能问题的基本思想与方法&#xff0c;是理解复杂算法的必备要素。在机器学习工作流程中&#xff0c;数学与代码高度交织在一起&#xff0c;代码通常可以根据数学直观地构建&#xff0c;甚至会共…

android编译的错误日志,Android Studio:编译器错误输出窗口在哪里?

当我在Android Studio中“运行”我的项目时&#xff0c;在“消息”窗口中&#xff0c;我得到&#xff1a;Gradle:FAILURE: Build failed with an exception.* What went wrong:Execution failed for task :play01:compileDebug.> Compilation failed; see the compiler erro…

为什么选择ASP.NET Core

什么是.NET有一次小飞去面试&#xff0c;面试官上来就问了一个宏观的问题&#xff1a;“你觉得什么是.NET”&#xff1f;小飞的脑子嗡嗡的&#xff0c;支吾了半天&#xff0c;才吐了一些碎片化的词语&#xff1a;“跨平台、开源、微软…”虽然作为一个.NET人&#xff0c;但是小…

c++中的new_handler

原文地址&#xff1a;http://blog.csdn.net/wzq981264/article/details/673630 在过去或者传统的模式中&#xff0c;当operator new不能满足一个内存分配请求的时候&#xff0c;它会返回一个空指针&#xff0c;但是现在如果operator new不能满足一个内存分配请求的时候&#xf…

抢不到“猫抓杯”怎么办?这些女神更喜欢

▲数据汪特别推荐点击上图进入玩酷屋不久前才送走了西方情人节&#xff0c;男同胞们的第二个“送礼节”----女神节。这个令所有女生翘首、期待、憧憬、摩拳擦掌的日子&#xff0c;令所有男士小心翼翼、挑礼物到崩溃的日子&#xff0c;就要到了。小木作为妇女之友&#xff0c;听…

程序出Bug,一定是环境的锅!

现象前几天&#xff0c;一个客户反映说&#xff0c;他看到的数据顺序是乱的&#xff0c;不是按照日期倒排。但是在测试环境、预生产环境&#xff0c;都无法重现问题&#xff0c;即使使用相同的程序版本。定位查看代码&#xff0c;出问题的功能使用了第三方ORM框架&#xff0c;无…

android webview js 失效,Android WebView注入JQuery、JS脚本及执行无效的问题解决

在项目中遇到JQuery注入后&#xff0c;执行无效的问题。我们知道必须在网页加载完成后&#xff0c;也就是在onPageFinished()方法被调用后才能执行被注入的JS。但是在有些手机上并不能成功执行&#xff0c;我的解决方案是设置一秒延迟后注入JS&#xff0c;成功了&#xff01;wh…

AIX逻辑卷管理(LVM)

VG PV PP LV LP关系图 转载于:https://www.cnblogs.com/limt/archive/2013/04/06/4199257.html

鸿蒙操作系统如何打通 Windows 操作系统?

华为&#xff1a;我们选择拥抱 Windows华为给出的解决方案是在微软 Windows 操作系统中部署 HarmonyOS 分布式插件。运行 Windows 操作系统的电脑和运行鸿蒙操作系统的华为手机将形成超级终端&#xff0c;文件资源管理器实现互通。在 Windows 文件资源管理器中&#xff0c;将显…

凯立德导航android历史版本,凯立德导航升级2020版

凯立德导航升级2020版是一款非常专业的手机机车导航软件&#xff0c;它可以为大家提供便捷的导航服务&#xff0c;用户只需要输入自己想去的地方&#xff0c;软件会智能推荐一条最便捷的路线&#xff0c;同时会告知用户目的地附近热门的吃喝玩乐场所&#xff0c;有需要的用户来…

用 Python 实现打飞机

全世界只有3.14 % 的人关注了数据与算法之美所用技术和软件python 2.7pygame 1.9.3pyCharm准备工作安装好 pygame 在第一次使用 pygame 的时候&#xff0c;pyCharm 会自动 install pygame。下载好使用的素材。技术实现初始化 pygame首先要初始化 pygame &#xff0c;之后设定一…

QT-Linux开发环境的搭建

转自&#xff1a;http://blog.csdn.net/wh_19910525/article/details/8118381 如果读者需要在Linux下进行开发&#xff0c;可以使用下面简单的步骤来搭建环境&#xff1a; &#xff08;下面以Ubuntu 12.04 为例进行说明&#xff09;1. 下载软件 到http://get.qt.nokia.com/qt/s…

把HttpClient换成IHttpClientFactory之后,放心多了

前言关于HttpClient的使用&#xff0c;个人在很多场景都派上用场了&#xff0c;比如在Winform或后台服务中用其调用接口获取和上传数据、微服务中用其进行各服务之间的数据共享等&#xff0c;到目前来看&#xff0c;似乎还没有出现过什么问题&#xff0c;但当我看到官方文档介绍…

android app银联支付,android app 快速接入银联支付流程(android studio版)

刚接触了下银联支付&#xff0c;在网上搜还是看官方文档银联支付都不是很清晰&#xff0c;所以自己总结一篇&#xff0c;希望可以帮助大家快速集成。一.进入下载官网&#xff0c;选择下载手机控件支付demo&#xff1a;https://open.unionpay.com/ajweb/help/file/techFile?pro…

基础排序算法 – 冒泡排序Bubble sort

原理是临近的数字两两进行比较,按照从小到大或者从大到小的顺序进行交换&#xff0c; 这样一趟过去后,最大或最小的数字被交换到了最后一位&#xff0c; 然后再从头开始进行两两比较交换&#xff0c;直到倒数第二位时结束。 从小到大排序&#xff1a; 原始待排序数组| 6 | 2 | …