2009-03-16 2 views
8

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

, например:

, если предположить, что компилятор вставит вызов функции ПОЛУЧИТЬ от собственности, так что я не должен сохранить возвращаемое значение в локальной переменной, чтобы избежать вызова функции.

Я хочу рекомендовать хорошую ссылку, которая описывает, что происходит?

ответ

18

Вы можете взглянуть на эти статьи:

JIT Optimizations - (Sasha Goldshtein - CodeProject)
Jit Optimizations: Inlining I (David Notario)
Jit Optimizations: Inlining II (David Notario)

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

17

Если вас беспокоит производительность, запустите профайлер. Then изменение код. Скорее всего, вы никогда не за миллион лет не угадаете 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-распознает это и удаляет проверки границ (как массивы фиксированными размер).

+0

Я не знал об этом последнем! Приятно знать, спасибо! – Groo

+0

Спасибо за информацию, но я прошу о хорошей ссылке для этой информации. –

+2

. Мое замечание состоит в том, что * no * ссылка действительно поможет вам в этом. ** Профилер ** будет. –

1

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

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

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

-1

Самая мощная оптимизация, выполняемая 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.

Для вашего конкретного вопроса, я бы сказал, вероятно, если вызов функции - hot.