Dans mon code de base actuel, les instructions complexes if
sont souvent remplacées par des appels de délégation. En raison de la structure du code, le même délégué sera appelé plusieurs fois au cours de l'application. Par exemple,Le C# JITter peut-il optimiser les appels de délégués répétés?
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;
}
}
Puisque la performance est une préoccupation ici, je me demande si le JITter finira par se rendre compte que l'une de ces méthodes est appelé à chaque fois et en ligne ou autrement optimiser l'appel.
Alors, le C JITter peut-il aligner ou optimiser les appels délégués multiples?
Que diriez-vous de l'évaluer pour voir quel genre de surdéclaré votre répartition par délégué a? Aussi, afaik utilisant des groupes de méthodes est plus cher que d'utiliser des expressions lambda, donc je suggère d'essayer '_exampleMethod = (a, b) => additionneur (a, b);'. Mais encore une fois, vous êtes curieux de savoir perf? Référence! – MarcinJuraszek
@MarcinJuraszek En ce qui concerne votre remarque sur les lambdas, les méthodes actuelles sont beaucoup plus compliquées, généralement autour de 25 lignes. Je ferai peut-être quelques benchmarks de performances pour voir l'impact réel sur les performances plus tard, mais je m'intéresse également à ce qui se passe techniquement en coulisses, pas seulement à l'impact réel sur les performances. Merci. – Defenestrator
@MarcinJuraszek Pourquoi croyez-vous que la création d'une nouvelle méthode qui ne fait qu'appeler une autre méthode, en transmettant exactement les mêmes paramètres et en ne faisant aucun travail productif serait plus efficace? – Servy