用BenchmarkDotNet看Property
生活随笔
收集整理的這篇文章主要介紹了
用BenchmarkDotNet看Property
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
屬性——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();} }調用測試方法統(tǒng)一如下:
第一組:構造實例化對象和方法內實例化對象,調用屬性差多少
[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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开源FastGithub
- 下一篇: 程序出Bug,一定是环境的锅!