.NET Core/Framework 创建委托以大幅度提高反射调用的性能

本文探讨了如何通过创建委托来显著提高.NET反射调用的性能。实验数据显示,使用反射得到的方法创建委托后的调用性能接近直接调用方法。文章详细介绍了实现过程,特别是借助`Delegate.CreateDelegate`方法,提供了泛型封装以增强易用性。
摘要由CSDN通过智能技术生成

都知道反射伤性能,但不得不反射的时候又怎么办呢?当真的被问题逼迫的时候还是能找到解决办法的。

为反射得到的方法创建一个委托,此后调用此委托将能够提高近乎直接调用方法本身的性能。(当然 Emit 也能够帮助我们显著提升性能,不过直接得到可以调用的委托不是更加方便吗?)


性能对比数据

性能对比数据
▲ 没有什么能够比数据更有说服力(注意后面两行是有秒数的)

可能我还需要解释一下那五行数据的含义:

  1. 直接调用(?应该没有什么比直接调用函数本身更有性能优势的吧
  2. 做一个跟直接调用的方法功能一模一样的委托(?目的是看看调用委托相比调用方法本身是否有性能损失,从数据上看,损失非常小
  3. 本文重点 将反射出来的方法创建一个委托,然后调用这个委托(?看看吧,性能跟直接调差别也不大嘛
  4. 先反射得到方法,然后一直调用这个方法(?终于可以看出来反射本身还是挺伤性能的了,50 多倍的性能损失啊
  5. 缓存都不用,从头开始反射然后调用得到的方法(?100 多倍的性能损失了

以下是测试代码,可以更好地理解上图数据的含义:

using System;
using System.Diagnostics;
using System.Reflection;

namespace Walterlv.Demo
{
   
    public class Program
    {
   
        static void Main(string[] args)
        {
   
            // 调用的目标实例。
            var instance = new StubClass();

            // 使用反射找到的方法。
            var method = typeof(StubClass).GetMethod(nameof(StubClass.Test), new[] {
    typeof(int) });

            // 将反射找到的方法创建一个委托。
            var func = InstanceMethodBuilder<int, int>.CreateInstanceMethod(instance, method);

            // 跟被测方法功能一样的纯委托。
            Func<int, int> pureFunc = value => value;

            // 测试次数。
            var count =
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值