В каком уровне компилятор C# или JIT оптимизируют код приложения?

Просто используйте Array#sort с блоком

golf.sort { |x, y| x[1] <=> y[1] }
=> [["ScoreH", 1], ["ScoreB", 3], ["ScoreD", 4], ["ScoreF", 9], ["ScoreA", 10], ["ScoreJ", 23], ["ScoreG", 45], ["ScoreC", 67], ["ScoreI", 87], ["ScoreE", 88]]

8
задан Joel Coehoorn 20 May 2009 в 08:17
поделиться

4 ответа

Можно хотеть смотреть на эти статьи:

Оптимизация JIT - (Sasha Goldshtein - CodeProject)
Оптимизация монеты в пять центов: встраивание I (David Notario)
Оптимизация монеты в пять центов: встраивание II (David Notario)

Чтобы быть честными, Вы не должны волноваться слишком много об этом уровне микродетали. Позвольте compiler/JIT'er волноваться об этом для Вас, это лучше в нем, чем Вы находитесь почти во всех случаях. Не становитесь одержимыми Преждевременной Оптимизацией. Внимание на получение Вашей работы кода, затем волнуйтесь об оптимизациях позже, если (a) это не работает достаточно быстро, (b) у Вас есть проблемы 'размера'.

18
ответ дан 3 November 2019 в 12:56
поделиться

Если Вы волнуетесь по поводу производительности, выполните профилировщика. Затем код изменения. Возможности состоят в том, что Вы никогда не будете через миллион лет предполагать 100% правильно, куда время идет. Вы могли изменять синхронизацию 0,02% и отъезд метода, который вносит 62% нагрузки. Вы могли также делать это хуже. Без профилировщика и доказательства, Вы являетесь слепыми.


Вы не можете предположить, что JIT встроит метод считывания свойства. Существует много причин, это может или не может сделать так; размер тела метода, виртуального, оценивает по сравнению со ссылочным типом, архитектурой, присоединенный отладчик, и т.д.

"Подъем" все еще имеет место и может все еще достигнуть сбережений, если код неоднократно называют в жестком цикле; например:

var count = list.Count;
for(int i = 0 ; i < count ; i++) {...}

(забудьте for по сравнению с foreach вышеупомянутое франка дебатов - это - ортогональное обсуждение). В вышеупомянутом "подъем" поможет производительности. Но только действительно сбивать с толку - с массивами, это - противоположное, и более эффективно не поднять его:

for(int i = 0 ; i < arr.Length ; i++) {...}

JIT распознает это и удаляет граничную проверку (поскольку массивы являются фиксированным размером).

17
ответ дан 3 November 2019 в 12:56
поделиться

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

Если Ваш метод называют так очень, и Вы действительно хотите, чтобы он встроил, можно встроить его сами за счет запутанного кода.

Я рекомендовал бы анализировать Ваш алгоритм, встраивать метод не сохранит величины скорости, в то время как лучший алгоритм может заставить Ваше время выполнения уменьшиться с часов до секунд.

1
ответ дан 3 November 2019 в 12:56
поделиться

Самая мощная оптимизация, выполняемая JIT, - это обычно встраивание. JIT может даже встраивать сотни функций глубоко (я слышал эту цифру для JikesRVM). Они даже встраивают вещи, которые не всегда можно встраивать, и откатывают их позже, если это необходимо (так называемая динамическая деоптимизация).

Хороший обзор - http://java.sun.com/products /hotspot/docs/whitepaper/Java_Hotspot_v1.4.1/Java_HSpot_WP_v1.4.1_1002_4.html.

Что касается вашего конкретного вопроса, я бы сказал, вероятно, если рассматриваемый вызов функции горячий .

-1
ответ дан 3 November 2019 в 12:56
поделиться
Другие вопросы по тегам:

Похожие вопросы: