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

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

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

Обычно, когда я создаю свои собственные функции построения графика, я создаю конструкцию:

op <- par("mypar"=myvalue)
on.exit(par(op))

, которая является стандартным способом возврата par к предыдущим значениям. Представьте, что вы запускали некоторые функции, которые действительно изменили некоторые элементы pars, и вам нужно выполнить сброс до значений по умолчанию при запуске в R. Каким удобный способ сделать это?

Или, другими словами: как достичь значений по умолчанию для par () ?

69
задан Joris Meys 26 April 2011 в 12:27
поделиться