Почему Func<>
, созданный из Expression<Func<>>
через .Compile(), значительно медленнее, чем просто объявленный Func<>
?
Я просто отказался от использования Func<IInterface, object>
, объявленного непосредственно на созданном из Expression<Func<IInterface, object>>
в приложении, над которым я работаю, и заметил, что производительность снижается.
Я только что сделал небольшой тест, а Func<>
, созданный из выражения, "почти" удваивает время Func<>
, объявленного напрямую.
На моей машине Direct 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; }
}
Как вернуть производительность?
Есть ли что-нибудь, что я могу сделать, чтобы получить Func<>
, созданный из Expression<Func<>>
, чтобы выполнить, как объявлено напрямую?