Avoiding the overhead of C# virtual calls
I have a few heavily optimized math functions that take 1-2 nanoseconds to complete. These functions are called hundreds of millions of times per second, so call overhead is a concern, despite the already-excellent performance.
In order to keep the program maintainable, the classes that provide these methods inherit an IMathFunction interface, so that other objects can directly store a specific math function and use it when needed.
public interface IMathFunction
{
double Calculate(double input);
double Derivate(double input);
}
public SomeObject
{
// Note: There are cases where this is mutable
private readonly IMathFunction mathFunction_;
public double SomeWork(double input, double step)
{
var f = mathFunction_.Calculate(input);
var dv = mathFunction_.Derivate(input);
return f - (dv * step);
}
}
This interface is causing an enormous overhead compared to a direct call due to how the consuming code uses it. A , whereas the virtual . Evidently, the presence of the interface and its subsequent translation of the virtual call is the bottleneck for this scenario.
I would like to retain both maintainability and performance if possible. I assume this would involve creating delegates with IL, but I wouldn't know where to start with that.