【发布时间】:2010-11-18 03:27:02
【问题描述】:
为什么通过 .Compile() 从 Expression<Func<>> 创建 Func<> 比仅使用直接声明的 Func<> 慢得多?
我刚刚在我正在开发的应用程序中从使用直接声明的Func<IInterface, object> 更改为从Expression<Func<IInterface, object>> 创建的应用程序,我注意到性能下降了。
我刚刚做了一个小测试,从表达式创建的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<> 像直接声明的那样执行?
【问题讨论】:
-
有趣的问题;我实际上接近直接案例的 4 倍。
-
(我的时间是在发布,在命令行,两次测试之前都有完整的GC)
-
如果 Func 是 Func 似乎没有区别
-
反映和读出为每种机制生成的 IL 可能会很有启发性。
-
@cdhowie 我无法让 dnp 为这个构建反汇编:| dotnetpad.net/ViewPaste/_Vx1bk-DVkqxCcSU1HE8tw#
标签: c# delegates expression expression-trees func