个人网站制作的主要内容,天津滨海新区地图全图,科技建站网站源码,网站开发项目终止协议书属性——Property#xff0c;由get,set访问器组成#xff0c;这是C#使用度比较高的类成员。今天分几组对比测试#xff0c;来看一下使用Property的性能。被测试对象#xff1a;public class MyClass
{private string _myProperty1 DateTime.Now.ToString();public string … 属性——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.RunTestProperty();
第一组构造实例化对象和方法内实例化对象调用属性差多少[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 FuncMyClass, string _delegate;public TestProperty(){_myClass new MyClass();_proinfo _myClass.GetType().GetProperty(MyProperty1);_delegate (FuncMyClass, string)Delegate.CreateDelegate(typeof(FuncMyClass, 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 (FuncMyClass, string)Delegate.CreateDelegate(typeof(FuncMyClass, string), proinfo.GetGetMethod(true)!);return dele(_myClass);}
}
结果PropertyC代理方式与PropertyA接近看来在其他场景中可以参考使用。但PropertyCExt要开销的多的多看来这是提前在实例化时做了工作所以在代理调用时才开销变少。