用BenchmarkDotNet看Method

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用BenchmarkDotNet看Method相关的知识,希望对你有一定的参考价值。

在前面的文章中看了Property的几种不同访问方式《用BenchmarkDotNet看Property》,性能调用上的差别明显,那同样作为class里重要成员,Method性能如何呢?

下面是被测试方法



    public class MyClass
    {
        public string MyMethod()
        {
            return DateTime.Now.ToString();
        }
    }

具体调用方式:实例化调用,反射调用,委托调用

using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;


namespace Demo01
{
    [MemoryDiagnoser]
    class MethodDemo : IDemo
    {
        public void Run()
        {
            BenchmarkRunner.Run<TestMethod>();
        }
    }
    public class TestMethod
    {
        private readonly MyClass _myClass;
        private readonly Func<MyClass, string> _delegate;
        private readonly MethodInfo _methodinfo;


        public TestMethod()
        {
            _myClass = new MyClass();
            _methodinfo = _myClass.GetType().GetMethod("MyMethod");
            _delegate = (Func<MyClass, string>)Delegate.CreateDelegate(typeof(Func<MyClass, string>), _methodinfo);
        }


        [Benchmark]
        public string MethodA()
        {
            return _myClass.MyMethod();
        }
        [Benchmark]
        public string MethodAExt()
        {
            var myClass = new MyClass();
            return myClass.MyMethod();
        }
        [Benchmark]
        public string MethodB()
        {
            return _methodinfo.Invoke(_myClass, new object[0]).ToString();
        }
        [Benchmark]
        public string MethodBExt()
        {
            var myClass = new MyClass();
            var methodinfo = _myClass.GetType().GetMethod("MyMethod");
            return methodinfo.Invoke(myClass, new object[0]).ToString();
        }
        [Benchmark]
        public string MethodC()
        {
            return _delegate(_myClass);
        }
        [Benchmark]
        public string MethodCExt()
        {
            var myClass = new MyClass();
            var methodinfo = myClass.GetType().GetMethod("MyMethod");
            var dele = (Func<MyClass, string>)Delegate.CreateDelegate(typeof(Func<MyClass, string>), methodinfo);
            return dele(myClass);
        }
    }

可以看到反射的性能还是相对低的,同样委托实例化的性能也比较低。

以上是关于用BenchmarkDotNet看Method的主要内容,如果未能解决你的问题,请参考以下文章

C#性能测试BenchmarkDotnet

在 XUnit 中运行 BenchmarkDotNet

.NET Core中的性能测试工具BenchmarkDotnet

BenchmarkDotNet性能测试

使用 BenchmarkDotNet 比较指定容量的 List 的性能

如何解决JUnit4单元测试报错 :method initializationerror not found