Предположим, я написал такой класс (количество функций на самом деле не имеет значения, но на самом деле их будет где-то около 3 или 4).
private class ReallyWeird
{
int y;
Func<double, double> f1;
Func<double, double> f2;
Func<double, double> f3;
public ReallyWeird()
{
this.y = 10;
this.f1 = (x => 25 * x + y);
this.f2 = (x => f1(x) + y * f1(x));
this.f3 = (x => Math.Log(f2(x) + f1(x)));
}
public double CalculusMaster(double x)
{
return f3(x) + f2(x);
}
}
Интересно, может ли компилятор C # оптимизировать такой код так, чтобы он не будет проходить через многочисленные вызовы стека.
Может ли он вообще встроить делегатов во время компиляции? Если да, то на каких условиях и в каких пределах? Если нет, есть ли ответ, почему?
Другой вопрос, может быть, даже более важный: будет ли это значительно медленнее, чем если бы я объявил f1, f2 и f3
как методы?
Я спрашиваю об этом, потому что хочу, чтобы мой код был максимально СУХИМ, поэтому я хочу реализовать статический класс, который расширяет базовую функциональность генератора случайных чисел (ГСЧ): его методы принимают одного делегата (например, из метода NextInt ()
RNG) и возврата другого делегата Func
(например, для генерации ulong
s), построенного поверх первого. и пока существует много разных RNG, которые могут генерировать int
s, я предпочитаю не думать о реализации всех тех же расширенных функций десять раз в разных местах.
Таким образом, эта операция может выполняться несколько раз (т.е. начальный метод класса может быть «обернут» делегатом дважды или даже трижды). Интересно, каковы будут накладные расходы на производительность.
Спасибо!