在我当前的代码库中,复杂的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;
}
}
由于性能是一个问题在这里,我想知道,如果抖动最终会认识到,这些方法之一是被称为每次和内嵌或以其他方式优化呼叫。
那么,可以C#JITter内嵌或以其他方式优化重复委托调用?
您如何对它进行基准测试以了解您的基于委托的调度具有哪种方式?另外,使用方法组的afaik比使用lambda表达式更昂贵,所以我建议尝试'_exampleMethod =(a,b)=>加法器(a,b);'。但是,你又对perf的好奇心好吗?基准! – MarcinJuraszek
@MarcinJuraszek就你对lambda表达的评论而言,实际的方法要复杂得多,通常在25行左右。我可能会做一些性能基准测试,以便稍后看到实际的性能影响,但我也对幕后技术发生的情况感兴趣,而不仅仅是实际的性能影响。谢谢。 – Defenestrator
@MarcinJuraszek你为什么认为创建一个新的方法,除了调用另一个方法,传递完全相同的参数以及不做任何有效的工作会更有效率? – Servy