Какие ключевые слова / инструменты существуют, чтобы помочь компилятору оптимизировать - PullRequest
4 голосов
/ 19 июля 2011

Часто нам говорят что-то вроде

Если вы вызываете метод с возвращаемым значением, которое не изменяется, выведите его из цикла.

например, при написании кода вроде:

for(int i=0; i < Instance.ExpensiveNonChangingMethod(); i++)
{
    // Stuff
}

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

Существует ли что-нибудь подобное?Возможно, что-то вроде или ?Или они уже могут делать такие вещи?

Возможно ли, что компилятор рассудит, что метод является чистой функцией сам по себе?

Есть ли что-нибудь, что я могу использовать в C #, что позволит компилятору выполнять больше оптимизации, чем в противном случае? Да, я знаю о преждевременной оптимизации.Я спрашиваю, в основном, из любопытства, но также, если что-то подобное есть, это будет «бесплатно», как только метод будет отмечен.

Ответы [ 2 ]

0 голосов
/ 24 декабря 2011

Возможно, это не то, что вам нужно, но вы можете переписать цикл так, чтобы дорогой метод вызывался только один раз (в начале цикла):

for (int i = Instance.ExpensiveNonChangingMethod();  i-- >= 0; )
{
    // Stuff
}

Это также можно записать как:

int i = Instance.ExpensiveNonChangingMethod();
while (i-- >= 0)
{
    // Stuff
}

Другой очевидный подход - просто использовать временную переменную (что означает выполнение оптимизации самостоятельно):

int n = Instance.ExpensiveNonChangingMethod();
for (int i = 0;  i < n;  i++)
{
    // Stuff
}
0 голосов
/ 24 декабря 2011

Некоторые проблемы с эффективностью обнаруживаются Microsoft FxCop , который является частью Platform SDK .

Список 18 проблем, связанных с производительностью, обнаружен: здесь .

Однако он не обнаруживает конкретный пример, который вы упомянули.

...