via .Compile()Func<>
から作成されたものは、宣言されたものを直接使用するよりもかなり遅いのはなぜですか?Expression<Func<>>
Func<>
Func<IInterface, object>
宣言されたものを直接使用することから、Expression<Func<IInterface, object>>
作業中のアプリで作成されたものに変更したところ、パフォーマンスが低下したことに気付きました。
ちょっとしたテストを行ったところ、式からの作成には、直接宣言されFunc<>
た場合の「ほぼ」2倍の時間がかかります。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; }
}
どうすればパフォーマンスを取り戻すことができますか?
Func<>
から作成されたExpression<Func<>>
ものを直接宣言されたものと同じように実行するためにできることはありますか?