Оптимизация кода
От: Аноним  
Дата: 20.04.05 07:16
Оценка:
Выполняет ли JIT оптимизацию IL-кода, или все компилится один к одному?
Re: Оптимизация кода
От: GarryIV  
Дата: 20.04.05 07:34
Оценка:
Hello, !

> Выполняет ли JIT оптимизацию IL-кода, или все компилится один к одному?


Что то делает...

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/fastmanagedcode.asp

The Just-in-Time compiler

...
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)

Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re[2]: Оптимизация кода
От: Аноним  
Дата: 20.04.05 07:46
Оценка: -1
Здравствуйте, GarryIV, Вы писали:

GIV>Hello, !


>> Выполняет ли JIT оптимизацию IL-кода, или все компилится один к одному?


GIV>Что то делает...


GIV>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/fastmanagedcode.asp


GIV>

GIV>The Just-in-Time compiler

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()
Re[3]: Оптимизация кода
От: GarryIV  
Дата: 20.04.05 08:12
Оценка:
Hello, !

GIV>> Что то делает...


GIV>> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndotnet/html/fastmanagedcode.asp


GIV>>

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" но будет ли реально это сделано я не берусь утверждать. Сделай тесты — посмотри.
Posted via RSDN NNTP Server 1.9
WBR, Igor Evgrafov
Re[4]: Оптимизация кода
От: Аноним  
Дата: 20.04.05 08:35
Оценка: +1
Как он может в это оптимизировать? А если я сделаю al.Add() в цикле, что, всё сломается?
Re[5]: Оптимизация кода
От: Аноним  
Дата: 20.04.05 08:42
Оценка: -1
А>Как он может в это оптимизировать? А если я сделаю al.Add() в цикле, что, всё сломается?

ты блин еще рекурсию бесконечно-вложенную сделай и спроси потом сломается ли она или нет
Re[3]: Оптимизация кода
От: xvost Германия http://www.jetbrains.com/company/people/Pasynkov_Eugene.html
Дата: 20.04.05 08:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Спасибо. Просто мне кажется где-то пробегала такая тема,

А>что вот такой код
А>будет компилятором оптимизирован в такой
А>Дык вот в IL-е ничего подобного я не заметил. Идет как и положено постоянно ображение к get_Count()

Все правильно. Вычисление того, является ли get_Count() инвариантом в цикле, в общем случае невозможно. Поэтому и не происходит вынос инварианта из цикла.
С уважением, Евгений
JetBrains, Inc. "Develop with pleasure!"
Re[4]: Оптимизация кода
От: Andir Россия
Дата: 20.04.05 08:46
Оценка: 10 (1) +2
Здравствуйте, GarryIV, Вы писали:

GIV>Чтоб понять что наоптимизировал JIT Comiler надо смотреть native код, который он порождает (как это сделать я не знаю).


cordbg.exe идущий в SDK.

С Уважением, Andir!
using(RSDN@Home 1.1.4 beta 3){/* Работаем! */}
Re[4]: Оптимизация кода
От: GlebZ Россия  
Дата: 20.04.05 15:50
Оценка:
Здравствуйте, xvost, Вы писали:

X>Все правильно. Вычисление того, является ли get_Count() инвариантом в цикле, в общем случае невозможно. Поэтому и не происходит вынос инварианта из цикла.

На уровне компиляции JIT многое другое возможно. Например inlining get_Count. Я не особо помню, подсчитывает ли он в рантайме количество (по моему да), так что весьма вероятно преобразование в ссылку на значение.

С уважением, Gleb.
... << RSDN@Home 1.1.4 beta 4 rev. 358>>
Re: Оптимизация кода
От: oleg542  
Дата: 20.04.05 19:53
Оценка: :)
Здравствуйте, Аноним, Вы писали:
А>Выполняет ли JIT оптимизацию IL-кода, или все компилится один к одному?
Если в методе используются поля обьектов, то создаются локальные переменные и инициализируются этими полями. Потом работа идёт через них (в этом случае экономится один push).
P.S. смотри в рефлекторе.
Re[2]: Оптимизация кода
От: Lloyd Россия  
Дата: 21.04.05 07:59
Оценка: +1
Здравствуйте, oleg542, Вы писали:

А>>Выполняет ли JIT оптимизацию IL-кода, или все компилится один к одному?

O>Если в методе используются поля обьектов, то создаются локальные переменные и инициализируются этими полями. Потом работа идёт через них (в этом случае экономится один push).
O>P.S. смотри в рефлекторе.

Результат работы jit-а в рефлекторе? Оригинально.
... << RSDN@Home 1.1.4 beta 6 rev. 422>>
Re[3]: Оптимизация кода
От: Аноним  
Дата: 20.04.05 08:21
Оценка: -1
Судя по результатом тестов, про которые я читал (результаты сравнения различных компиляторов), это делается. А "бесполезные" циклы, вообще, удаляются.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[3]: Оптимизация кода
От: Аноним  
Дата: 20.04.05 08:46
Оценка:
чтоб смотреть натив релиза надо сделать делние но 0 в том месте где ты хочешь тормознуть прогу, после этого он тебе предложет посмотреть дизасембли, а если не покажет то заходишь в дебуг и сам его включаеш.
---------------------
Ты можеш все ибо все есть в тебе.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Оптимизация кода
От: Аноним  
Дата: 20.04.05 20:21
Оценка: -1
> cordbg.exe идущий в SDK.
Зачем? В VS2002-2003 (7.0-7.1) cтавишь break-point на то место где хочешь посмотреть исходный код, лезешь в меню Debug->Windows->Disassembly, открываешь появившуюся страницу и смотришь native код.
Любое сложное решение — проявление лени человека, которому это поручили


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[4]: Оптимизация кода
От: Аноним  
Дата: 21.04.05 03:52
Оценка:
QuICE
Оптимизированный код тяжел для исследования?
---------------------
Ты можеш все ибо все есть в тебе.


данное сообщение получено с www.gotdotnet.ru
ссылка на оригинальное сообщение
Re[5]: Оптимизация кода
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.04.05 16:03
Оценка:
Здравствуйте, 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>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Оптимизация кода
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.04.05 16:03
Оценка:
Здравствуйте, xvost, Вы писали:

X>Все правильно. Вычисление того, является ли get_Count() инвариантом в цикле, в общем случае невозможно. Поэтому и не происходит вынос инварианта из цикла.


Вообще-то более чем возможно. Просто оптимизатор халявит.
... << RSDN@Home 1.1.4 beta 4 rev. 351>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: Оптимизация кода
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.04.05 16:03
Оценка: -1
Здравствуйте, Corwin_XX, Вы писали:

C_X>Судя по результатом тестов, про которые я читал (результаты сравнения различных компиляторов), это делается. А "бесполезные" циклы, вообще, удаляются.


"Не читайте советских газет перед едой." (с)
... << RSDN@Home 1.1.4 beta 4 rev. 351>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Оптимизация кода
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.04.05 16:03
Оценка: -1
Здравствуйте, <Аноним>, Вы писали:

А>Как он может в это оптимизировать? А если я сделаю al.Add() в цикле, что, всё сломается?


И тем не менее при наличии хорошего оптимизатора подобная оптимизация возможна. К сожалению, подобные оптимизации не делаются даже с массивами и в foreach-ах. А уж там им ни что не препятствует.
... << RSDN@Home 1.1.4 beta 4 rev. 351>>
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Оптимизация кода
От: Igor Trofimov  
Дата: 24.04.05 16:47
Оценка:
VD>И тем не менее при наличии хорошего оптимизатора подобная оптимизация возможна. К сожалению, подобные оптимизации не делаются даже с массивами и в foreach-ах. А уж там им ни что не препятствует.

здесь
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.