私の現在のコードベースでは、複雑なif
ステートメントは代行コールで置き換えられることがよくあります。コードの構造のため、同じデリゲートがアプリケーションの過程で何度も呼び出されます。たとえば、パフォーマンス以来C#JITterは繰り返しの代理コールを最適化できますか?
class ExampleClass
{
private delegate double ExampleDelegate(double x, double y);
private ExampleDelegate _exampleMethod;
private bool _condition1;
...
public double ApiFunction(List<double> a, List<double> b, bool condition2)
{
if ((_condition1 && !condition2) || getCondition3())
{
_exampleMethod = adder;
}
else
{
_exampleMethod = subtracter;
}
double finalResult = 0;
for (int i = 0; i < a.Count; i++)
{
finalResult += _exampleMethod(a[i], b[i]);
}
return finalResult;
}
private double adder(double a, double b)
{
return a + b;
}
private double subtracter(double a, double b)
{
return a - b;
}
}
は、ジッタは、最終的にこれらのメソッドの1つが、すべての時間とインラインで呼び出されていることを認識し、あるいは呼び出しを最適化する場合、私は思ったんだけど、ここで懸念されます。
したがって、は、C#JITterをインライン化するか、繰り返し代理人呼び出しを最適化することができます?
デリゲートベースのディスパッチにどのようなヒントがあるのかをベンチマークするのはどうでしょうか?また、メソッド群を使うafaikはラムダ式よりも高価ですので、 '_exampleMethod =(a、b)=>加算器(a、b);'を試してみることをお勧めします。しかしもう一度、あなたはperfについて興味がありますか?基準! – MarcinJuraszek
@MarcinJuraszekラムダについてのあなたの発言のように、実際の方法ははるかに複雑で、通常約25行です。後で実際のパフォーマンスへの影響を見るためにいくつかのパフォーマンスベンチマークを行うかもしれませんが、実際のパフォーマンスへの影響だけでなく、技術的に何が起こっているのかも興味があります。ありがとう。 – Defenestrator
@MarcinJuraszek何故同じメソッドを呼び出すだけで、全く同じパラメータを渡し、生産的な作業をしない新しいメソッドを作成する方が効率的だと思いますか? – Servy