gpt4 book ai didi

c# - 编译表达式树性能

转载 作者:太空宇宙 更新时间:2023-11-03 23:02:05 34 4
gpt4 key购买 nike

如果运行 following code

using System;
using System.Linq.Expressions;
using System.Diagnostics;

public class E
{
public double V { get; set; }
}

public class Program
{
public static void Main()
{
E e = new E();
Func<double> f = () => e.V;

Expression expr = Expression.Property(Expression.Constant(e), "V");
Expression<Func<double>> exp = Expression.Lambda<Func<double>>(expr);
Func<double> ef = exp.Compile();

e.V = 123;

int attempts = 5;
for (int j = 0; j < attempts; j++)
{
int c = 100000;

double[] r1 = new double[c];
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < c; i++)
{
r1[i] = f();
}
sw.Stop();

double[] r2 = new double[c];
Stopwatch sw2 = new Stopwatch();
sw2.Start();
for (int i = 0; i < c; i++)
{
r2[i] = ef();
}
sw2.Stop();

double rat = (double)sw.ElapsedTicks / sw2.ElapsedTicks;

Console.WriteLine(rat);
}
}
}

然后事实证明编译表达式比 lambda 慢得多。是预期的结果吗?是否有可能以某种方式重写表达式以获得等效代码,但哪个会运行得更快?

最佳答案

您的委托(delegate) f 是使用编译生成的类创建的,该类具有 E 类型的字段 e 和如下访问值:

return <Target>.e.V;

在第二种情况(表达式)中,委托(delegate)是使用常量指令创建的,该指令使用闭包作为目标,并带有一个对象数组,其中 e 是第一个元素。代码可以这样表示:

return ((E)<Target>.Constants[0]).V;

这就是第一种情况下性能更好的原因。

注意:使用 Visual Studio 中的“观察窗口”,当您调试代码时,您可以检查“f.Target”和“ef.Target”以确认它。

关于c# - 编译表达式树性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42751759/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com