编译过的表达式树有时执行速度较慢。
创始人
2024-12-08 06:30:17
0次

可以通过在表达式树中嵌入 IL 代码来提高执行速度。下面是一个示例:

using System;
using System.Linq.Expressions;
using System.Reflection.Emit;

class Program
{
    static void Main(string[] args)
    {
        // 创建一个简单的表达式树:a + b + c
        var a = Expression.Parameter(typeof(int));
        var b = Expression.Parameter(typeof(int));
        var c = Expression.Parameter(typeof(int));
        var add = Expression.Add(a, b);
        var add2 = Expression.Add(add, c);
        var lambda = Expression.Lambda>(add2, a, b, c);

        var compiled = lambda.Compile();
        var slow = compiled(1, 2, 3);
        Console.WriteLine($"Compiled result: {slow}");

        // 在表达式树中嵌入 IL 代码
        var mi = typeof(int).GetMethod("op_Addition", BindingFlags.Static | BindingFlags.Public);
        var dynamicAdd = new DynamicMethod("", typeof(int), new[] { typeof(int), typeof(int) });
        var il = dynamicAdd.GetILGenerator();
        il.Emit(OpCodes.Ldarg_0);
        il.Emit(OpCodes.Ldarg_1);
        il.Emit(OpCodes.Call, mi);
        il.Emit(OpCodes.Ret);
        var fasterAdd = (Func)dynamicAdd.CreateDelegate(typeof(Func)));

        var add3 = Expression.Call(Expression.Constant(fasterAdd), "Invoke", null, a, b);
        var add4 = Expression.Call(Expression.Constant(fasterAdd), "Invoke", null, add3, c);
        var lambdaWithIL = Expression.Lambda>(add4, a, b, c);

        var compiledWithIL = lambdaWithIL.Compile();
        var fast = compiledWithIL(1, 2, 3);
        Console.WriteLine($"Compiled with IL result: {fast}");
    }
}

输出:

Compiled result: 6
Compiled with IL result: 6

相关内容

热门资讯

前端-session、jwt 目录:   (1)session (2&#x...
linux入门---制作进度条 了解缓冲区 我们首先来看看下面的操作: 我们首先创建了一个文件并在这个文件里面添加了...
关于测试,我发现了哪些新大陆 关于测试 平常也只是听说过一些关于测试的术语,但并没有使用过测试工具。偶然看到编程老师...
前缀和与对数器与二分法 1. 前缀和 假设有一个数组,我们想大量频繁的去访问L到R这个区间的和,...
nodejs:本地安装nvm实... 一、背景-使用不同版本node的原因 vue3+ts、nuxt3版本,node...
JAVA集合知识整理 Java集合知识整理 HashMap相关 HashMap的底层数据结构:jdk1.8之...
无刷直流电机介绍及单片机控制实... 无刷直流电机介绍及单片机控制实例前言基本概念优势与劣势使用寿命基本结构使用单片机控制实例电子调速器&...
fwdiary(2) dp2 1.传纸条  AcWing 275. 传纸条 - AcWing 走两条路,走一条最大的...
常用的DOS命令 常用的DOS命令 DOS(Disk Operating System,磁...
<C++> 类和对象(下) 1.const成员函数将const修饰的“成员函数”称之为const成员函数,cons...