gpt4 book ai didi

.net - 委托(delegate)和结构的速度问题

转载 作者:行者123 更新时间:2023-12-01 02:41:44 25 4
gpt4 key购买 nike

我在结构和委托(delegate)方面遇到了一些速度问题 - 使用以下控制台应用程序代码:

public delegate string StringGetter();
public class LocalString
{
public LocalString(string value)
{
this.value = value;
}

public StringGetter Getter
{
get
{
return new StringGetter(this.GetValue);
}
}

private string GetValue()
{
return value;
}

private string value;
}


class Program
{
static void Main(string[] args)
{
var start = DateTime.Now;
for (int i = 0; i < 2000000; i++)
{
var val = new LocalString( "hello World" );
val.Getter();
}
Console.WriteLine((DateTime.Now - start).TotalMilliseconds);
Console.ReadKey();
}
}

在我的机器上执行时,它需要大约 1.8 秒...如果我将结构更改为一个类,它会在大约 0.1 秒内运行。我查看了底层汇编代码和开源 ROTOR 代码以了解原因,并且有一些特殊代码用于具有结构目标的委托(delegate),我猜它是用于处理函数 MethodDesc* COMDelegate 中的装箱和拆箱::GetDelegateCtor(TypeHandle delegateType, MethodDesc *pTargetMethod, DelegateCtorArgs *pCtorData)。

另一点——如果你在 VS2008 中针对 .net 3.5 构建此应用程序,则应用程序运行速度比在针对 .net 3.5 的 VS2010 中运行它更快。我还没弄清楚这是为什么。

欢迎任何评论/更好的启发......

问候

最佳答案

这很难准确回答,委托(delegate)的 CLR 支持代码是一个难以破解的难题。我最好的猜测是取消/装箱结构值所需的开销。委托(delegate)调用是通过一个 stub 进行的,该 stub 首先将值装箱,以便可以调用实例方法。调用后,该方法的任何副作用都需要复制回原始结构。与对引用类型的实例方法的简单调用相比,这很昂贵,它们非常快。我没有看到任何验证结构值活跃性的证据,这有点奇怪,但很可能在某个地方。

关于.net - 委托(delegate)和结构的速度问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8077261/

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