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

Часто нам говорят такие вещи, как,

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

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

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

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

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

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

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

2 ответа

Решение

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

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

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

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

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
}
Другие вопросы по тегам