C # Объявление локальных против переменных функции объема и производительности против читаемости / надежности - PullRequest
0 голосов
/ 28 октября 2018

Мне уже давно интересно, как решить эту проблему, и я не могу найти элегантного решения.Я думаю, что некоторые примеры - самый простой способ понять проблему.

Допустим, у нас есть этот код внутри класса, и x и y должны начинаться с 0, когда их функции вызываются:

// here we have x as a local variable
private void functionX() {
    int x = 0;
    // ...
    // do stuff with x
    // ...
}

// here we have y as an out of function scope variable
int y;
private void functionY() {
    y = 0;
    // ...
    // do stuff with y
    // ...
}

public void update() 
{
    // this is slower because x gets a new instance every time functionX gets called    
    for (int i = 0; i < 100000; i++) {
        functionX();
    }

    // this is faster because y gets only one instance before the function ever gets called
    for (int i = 0; i < 100000; i++) {
        functionY();
    }
}

Я проверил этот код, и использование переменной области видимости вне функции вместо использования локальной переменной дает лучшую производительность (хотя и незначительно в этом примере, но, тем не менее, увеличение производительности).Недостатком является то, что вы должны объявить переменную функции вне области действия функции, чтобы получить этот выигрыш в производительности, который делает ваш код более запутанным и более подверженным ошибкам.

Это очень простопример, но что произойдет, если у вас есть тысячи строк кода с тоннами функциональных переменных такого рода, и выигрыш в производительности, связанный с тем, что они находятся вне области действия, нельзя игнорировать, но нельзя игнорировать беспорядок, который вы создаете, когда все эти переменные находятся вне области видимостиили?Есть ли решение этой проблемы, или вам просто необходимо будет сделать выбор между производительностью и удобочитаемостью / надежностью?

пс. создание статических переменных x или y внутри их функций неработать либо тогда, когда вам нужно создать несколько объектов из класса, в котором они находятся (все ваши объекты будут иметь один экземпляр x и y для всей среды выполнения программы)

Редактировать: еще больше упростить код

1 Ответ

0 голосов
/ 28 октября 2018

«Я проверил этот код, и использование переменной области видимости вне функции вместо использования локальной переменной дает лучшую производительность (хотя и незначительно в этом примере, но, тем не менее, наблюдается повышение производительности)».Я думаю, что для этого требуется оценка производительности: https://ericlippert.com/2012/12/17/performance-rant/ Пока вы делали часть 1 (надеюсь, так, что это дает значимые результаты), 2-6 все еще применимы для вашего случая.

Я рассматриваю удобочитаемость, затемНадежность самых важных вещей.Множество микрооптимизаций (удаление мертвого кода, создание внутренних функций, добавление или удаление временных переменных) можно оставить JiT.Если вы как-то действительно нуждаетесь в этой разнице, то в 99% случаев вы делаете Программирование в реальном времени .Несмотря на всю мощь, программирование в реальном времени не является сильной стороной .NET Framework.Наличие сборщика мусора, как правило, дисквалифицирует.

...