【发布时间】:2011-11-10 21:17:13
【问题描述】:
我在结构和委托方面遇到了一些速度问题 - 使用以下控制台应用程序代码:
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 代码以了解原因,并且有一些特殊代码用于具有结构目标的委托,我猜这些代码用于处理函数 MethodDesc* COMDelegate:: 中的装箱和拆箱: GetDelegateCtor(TypeHandle delegateType, MethodDesc *pTargetMethod, DelegateCtorArgs *pCtorData)。
另一点 - 如果您在 VS2008 中针对 .net 3.5 构建此应用程序,则应用程序运行速度比在针对 .net 3.5 的 VS2010 中运行它更快。我还没弄清楚这是为什么。
欢迎任何 cmets / 更好的启蒙......
问候 李
【问题讨论】:
-
这个例子是部分设计的(有些是从真实代码中提取的)只是为了重现这个问题。诚然,我本可以进一步减少它,但它确实可以编译和运行。
-
@leppie:我建议你实际上尝试编译它,然后重新评估你的位置......
-
@WillemvanRumpt:我承认。 :) 但问题是为什么要使用
new StringGetter(somestringgetter)而不是instance.Getter?事实上,我觉得奇怪的是委托有这样的构造函数(采用相同类型的委托)。我认为这种“魔法”没有任何意义。 -
澄清我的观点:
var k = new Action(new Action( new Action (K)));是有效的,完全是血腥可怕的代码。 -
@leppie:哦,我们可以同意代码的高白板尖叫值:)
标签: .net performance delegates struct