Эффективность стека делегатов

Предположим, я написал такой класс (количество функций на самом деле не имеет значения, но на самом деле их будет где-то около 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, я предпочитаю не думать о реализации всех тех же расширенных функций десять раз в разных местах.

Таким образом, эта операция может выполняться несколько раз (т.е. начальный метод класса может быть «обернут» делегатом дважды или даже трижды). Интересно, каковы будут накладные расходы на производительность.

Спасибо!

7
задан wh1t3cat1k 26 April 2011 в 12:00
поделиться