...
Unlike a traditional off-line C++ compilation process, the time spent in the JIT compiler is a "wall clock time" delay, in each user's face, so the JIT compiler does not have the luxury of exhaustive optimization passes. Even so, the list of optimizations the JIT compiler performs is impressive:
Constant folding
Constant and copy propagation
Common subexpression elimination
Code motion of loop invariants
Dead store and dead code elimination
Register allocation
Method inlining
Loop unrolling (small loops with small bodies)
GIV>...
GIV>Unlike a traditional off-line C++ compilation process, the time spent in the JIT compiler is a "wall clock time" delay, in each user's face, so the JIT compiler does not have the luxury of exhaustive optimization passes. Even so, the list of optimizations the JIT compiler performs is impressive:
GIV>Constant folding
GIV>Constant and copy propagation
GIV>Common subexpression elimination
GIV>Code motion of loop invariants
GIV>Dead store and dead code elimination
GIV>Register allocation
GIV>Method inlining
GIV>Loop unrolling (small loops with small bodies)
Спасибо. Просто мне кажется где-то пробегала такая тема,
что вот такой код
ArrayList ar = new ArrayList();
for(int i = 0; i < ar.Count; i++)
{
ar[i] = ...;
}
будет компилятором оптимизирован в такой
ArrayList ar = new ArrayList();
int count = ar.Count;
for(int i = 0; i < count; i++)
{
ar[i] = ...;
}
Дык вот в IL-е ничего подобного я не заметил. Идет как и положено постоянно ображение к get_Count()
GIV>> Constant folding
GIV>> Constant and copy propagation
GIV>> Common subexpression elimination
GIV>> Code motion of loop invariants
GIV>> Dead store and dead code elimination
GIV>> Register allocation
GIV>> Method inlining
GIV>> Loop unrolling (small loops with small bodies)
> Спасибо. Просто мне кажется где-то пробегала такая тема, > что вот такой код >
> ArrayList ar = new ArrayList();
> for(int i = 0; i < ar.Count; i++)
> {
> ar[i] = ...;
> }
>
> будет компилятором оптимизирован в такой
>
> ArrayList ar = new ArrayList();
> int count = ar.Count;
> for(int i = 0; i < count; i++)
> {
> ar[i] = ...;
> }
>
> Дык вот в IL-е ничего подобного я не заметил. Идет как и положено > постоянно ображение к get_Count()
Чтоб понять что наоптимизировал JIT Comiler надо смотреть native код, который он порождает (как это сделать я не знаю). В принципе этот пример попадает под "Code motion of loop invariants" но будет ли реально это сделано я не берусь утверждать. Сделай тесты — посмотри.
Здравствуйте, Аноним, Вы писали:
А>Спасибо. Просто мне кажется где-то пробегала такая тема, А>что вот такой код А>будет компилятором оптимизирован в такой А>Дык вот в IL-е ничего подобного я не заметил. Идет как и положено постоянно ображение к get_Count()
Все правильно. Вычисление того, является ли get_Count() инвариантом в цикле, в общем случае невозможно. Поэтому и не происходит вынос инварианта из цикла.
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Здравствуйте, GarryIV, Вы писали:
GIV>Чтоб понять что наоптимизировал JIT Comiler надо смотреть native код, который он порождает (как это сделать я не знаю).
Здравствуйте, xvost, Вы писали:
X>Все правильно. Вычисление того, является ли get_Count() инвариантом в цикле, в общем случае невозможно. Поэтому и не происходит вынос инварианта из цикла.
На уровне компиляции JIT многое другое возможно. Например inlining get_Count. Я не особо помню, подсчитывает ли он в рантайме количество (по моему да), так что весьма вероятно преобразование в ссылку на значение.
Здравствуйте, Аноним, Вы писали: А>Выполняет ли JIT оптимизацию IL-кода, или все компилится один к одному?
Если в методе используются поля обьектов, то создаются локальные переменные и инициализируются этими полями. Потом работа идёт через них (в этом случае экономится один push).
P.S. смотри в рефлекторе.
Здравствуйте, oleg542, Вы писали:
А>>Выполняет ли JIT оптимизацию IL-кода, или все компилится один к одному? O>Если в методе используются поля обьектов, то создаются локальные переменные и инициализируются этими полями. Потом работа идёт через них (в этом случае экономится один push). O>P.S. смотри в рефлекторе.
чтоб смотреть натив релиза надо сделать делние но 0 в том месте где ты хочешь тормознуть прогу, после этого он тебе предложет посмотреть дизасембли, а если не покажет то заходишь в дебуг и сам его включаеш.
---------------------
Ты можеш все ибо все есть в тебе.
> cordbg.exe идущий в SDK.
Зачем? В VS2002-2003 (7.0-7.1) cтавишь break-point на то место где хочешь посмотреть исходный код, лезешь в меню Debug->Windows->Disassembly, открываешь появившуюся страницу и смотришь native код.
Любое сложное решение — проявление лени человека, которому это поручили
Здравствуйте, QuICE, Вы писали:
>> cordbg.exe идущий в SDK. QIC>Зачем? В VS2002-2003 (7.0-7.1) cтавишь break-point на то место где хочешь посмотреть исходный код, лезешь в меню Debug->Windows->Disassembly, открываешь появившуюся страницу и смотришь native код.
Для запускаемого под отладчиком приложение принципиально не генерируется оптимальный код. Так что или пытаться приатачиться студией на ходу (с бабушка надвое предсказанным результатом), или cordbg.exe.
... << RSDN@Home 1.1.4 beta 4 rev. 351>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, xvost, Вы писали:
X>Все правильно. Вычисление того, является ли get_Count() инвариантом в цикле, в общем случае невозможно. Поэтому и не происходит вынос инварианта из цикла.
Вообще-то более чем возможно. Просто оптимизатор халявит.
... << RSDN@Home 1.1.4 beta 4 rev. 351>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, Corwin_XX, Вы писали:
C_X>Судя по результатом тестов, про которые я читал (результаты сравнения различных компиляторов), это делается. А "бесполезные" циклы, вообще, удаляются.
"Не читайте советских газет перед едой." (с)
... << RSDN@Home 1.1.4 beta 4 rev. 351>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Здравствуйте, <Аноним>, Вы писали:
А>Как он может в это оптимизировать? А если я сделаю al.Add() в цикле, что, всё сломается?
И тем не менее при наличии хорошего оптимизатора подобная оптимизация возможна. К сожалению, подобные оптимизации не делаются даже с массивами и в foreach-ах. А уж там им ни что не препятствует.
... << RSDN@Home 1.1.4 beta 4 rev. 351>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
VD>И тем не менее при наличии хорошего оптимизатора подобная оптимизация возможна. К сожалению, подобные оптимизации не делаются даже с массивами и в foreach-ах. А уж там им ни что не препятствует.