属性——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要开销的多的多,看来这是提前在实例化时做了工作,所以在代理调用时才开销变少。

用BenchmarkDotNet看Property相关推荐

  1. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  2. MyBatis Generator 详解

    MyBatis Generator中文文档 MyBatis Generator中文文档地址: http://mbg.cndocs.tk/ 该中文文档由于尽可能和原文内容一致,所以有些地方如果不熟悉,看 ...

  3. 使用 JavaScriptService 在.NET Core 里实现DES加密算法

    文章<ASP.NET Core loves JavaScript>和<跨平台的 NodeJS 组件解决 .NetCore 不支持 System.Drawing图形功能的若干问题> ...

  4. Python学习——02-Python基础——【9-面向对象进阶】——isinstance(obj,cls)、反射等...

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 1 class Foo(objec ...

  5. python进阶装饰器_Python进阶: 通过实例详解装饰器(附代码)

    Python中的装饰器有很多用处,比如输出日志.参数检查.代理设置.计数计时.结果缓存等等.本文就通过几个装饰器例子,详细解释一下Python中装饰器的用法.一步步从简到繁学习装饰器用法 其他一些装饰 ...

  6. python学习------面向对象进阶

    一 isinstance(obj,cls)和issubclass(sub,super) isinstance(obj,cls)检查是否obj是否是类 cls 的对象 class Foo(object) ...

  7. 标签系列二:spring 中bean解释以及bean标签里面的属性

    一.bean标签: 英文解释:Defines a single (usually named) bean. A bean definition may contain nested tags for ...

  8. Android 4.0 SDK新特性

    Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Android 3.x 版本中广泛使用的API和全息图像主题 ...

  9. Android4.0 SDK新功能详解

    Android 4.0 平台 API等级:14 Android 4.0 是一次重要的平台发布版,为用户和应用程序开发者增加了大量的新特性.在下面我们将讨论的所有新特性和API中,因为它将 Androi ...

最新文章

  1. 织梦手机站下一篇变上一篇而且还出错Request Error!
  2. memcache安装
  3. Linux的僵尸进程产生原因及解决方法
  4. stat在python中_stat模块接口
  5. mysql怎么保存视图_MySQL的视图和存储
  6. 21幅非常有创意的倒影摄影作品欣赏
  7. apache的虚拟目录配置
  8. [文摘20090622]HP大中华区总裁孙振耀退休十五天后九大感言
  9. VS2010免注册调用大漠插件
  10. 詹森不等式的积分形式
  11. 8086/8088,80286,80386的CPU寄存器
  12. Halcon XLD 算子集合
  13. Vue.js :使用LODOP打印表格文件
  14. Windows11电脑丢失了数据该怎么恢复?
  15. 计算机毕业设计ssm 曲沃县农产品销售系统(附源码)
  16. Helm安装Harbor
  17. 基于MATLAB的数字滤波器设计
  18. Linux CentOS7 ssh免密钥登录
  19. 基于php学生信息管理系统——计算机毕业设计
  20. 戴尔电脑恢复系统后,D盘被加密Bitlocker,要求输入48位密钥,才能打开D盘---解决过程

热门文章

  1. Gestalt - 在浏览器里用 python/ruby 写客户端脚本
  2. 4K 海思 联咏 芯片_老电视也有春天,换装海美迪4K电视盒子H7 Plus
  3. Arduino I/O Expansion Shield V7.1
  4. Spring.net学习记录
  5. 闭包 —JavaScript面向对象高级
  6. 单一职责原则--设计模式系列
  7. 1Android系统移植与驱动开发概述
  8. 在 App 扩展和主 App 间共享数据
  9. 有意思的记录-shell(持续更新)
  10. 在Word XP中也能插入国际音标、拼音