为什么通过 .Compile() 从 Expression<Func<>>
创建的 Func<>
比直接声明的 Func<>
运行速度慢得多?
我在正在开发的应用程序中切换了使用从 Expression<Func<IInterface, object>>
创建的 Func<IInterface, object>
,结果发现性能下降了。
我进行了一个小测试,从表现上来看,从 Expression 创建的 Func<>
运行时间是直接声明的 Func<>
的“几乎”两倍。
在我的机器上,直接声明的 Func<>
大约需要 7.5 秒钟,而 Expression<Func<>>
则需要大约 12.6 秒钟。
下面是我使用的测试代码(运行于 Net 4.0)
// Direct
Func<int, Foo> test1 = x => new Foo(x * 2);
int counter1 = 0;
Stopwatch s1 = new Stopwatch();
s1.Start();
for (int i = 0; i < 300000000; i++)
{
counter1 += test1(i).Value;
}
s1.Stop();
var result1 = s1.Elapsed;
// Expression . Compile()
Expression<Func<int, Foo>> expression = x => new Foo(x * 2);
Func<int, Foo> test2 = expression.Compile();
int counter2 = 0;
Stopwatch s2 = new Stopwatch();
s2.Start();
for (int i = 0; i < 300000000; i++)
{
counter2 += test2(i).Value;
}
s2.Stop();
var result2 = s2.Elapsed;
public class Foo
{
public Foo(int i)
{
Value = i;
}
public int Value { get; set; }
}
如何提高代码性能?
是否有什么方法可以让从 Expression<Func<>>
创建的 Func<>
性能与直接声明的函数一样好呢?