LINUX.ORG.RU

статическая и динамическая оптимизация кода


0

0

Кто-нибудь может объяснить в двух словах, на чём основана возможность оптимизации кода во время выполнения (если таковая вообще существует)? Какая информация о ходе выполнения программы не известна при наличии исходника и априорного знания характеристик набора инструкций целевого процессора?

★★★★★
Ответ на: комментарий от dimon555

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

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

* Небольшие функции, которые часто используются (вот это "часто" и определяется в рантайме), инлайнятся.
* Чтение переменных, которые часто используются и редко меняют значение, заменяется на константу.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

К оптимизации подобного рода можно причислить compacting GC - он ложит связанные данные рядом и это может уменьшить cache miss-ы.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

>* Небольшие функции, которые часто используются (вот это "часто" и определяется в рантайме), инлайнятся.

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

>Чтение переменных, которые часто используются и редко меняют значение, заменяется на константу.

а как среда узнает, когда значение, положенное как константа, фактически меняется?

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

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

1) Это не самая тривиальная задача.

2) Разработчик библиотеки этого чаще всего не знает.

> а как среда узнает, когда значение, положенное как константа, фактически меняется?

Например с переменной связывается список функций, "зависящих" от неё, если она меняется, она где-нибудь помечается как "неблагонадёжная", все скомпилированные функции, где она использовалась, перекомпилируются с учётом того, что она уже не константа.

Legioner ★★★★★
()
Ответ на: комментарий от Legioner

с инлайнингом более-менее ясно

>Например с переменной связывается список функций, "зависящих" от неё, если она меняется, она где-нибудь помечается как "неблагонадёжная", все скомпилированные функции, где она использовалась, перекомпилируются с учётом того, что она уже не константа.

судя по описанию, получается нехилый оверхэд, а стот ли овчинка выделки?

seiken ★★★★★
() автор топика
Ответ на: комментарий от seiken

> судя по описанию, получается нехилый оверхэд, а стот ли овчинка выделки?

Если в языке есть понятие констант - нет, конечно. Если нет - то может стоить. Например Scheme, там все функции - суть переменные, значениями которых является функция. Например +. С другой стороны никто + на другую функцию менять не будет. По крайней мере в 99% случаев. Поэтому разумно инлайнить её. А если уж найдётся такой умник, что переопределит, ну немножко просядет производительность. Кстати перекомпилировать необязательно, можно просто инвалидировать, и компилировать когда это надо.

Legioner ★★★★★
()

> Кто-нибудь может объяснить в двух словах, на чём основана возможность оптимизации кода во время выполнения (если таковая вообще существует)?

Там "оптимизауия" происходит в основном за счёт того, что сначала селают плохо, а потом вернут как было. Например, как в яве сначала объявят все функции вируальными, а потом при отсутствии переопределений заменяют вызов на не_виртуальный.

gaa ★★
()

> на чём основана возможность оптимизации кода во время выполнения (если таковая вообще существует)?

ленивые вычисления, мемоизация -- вот примеры оптимизации в рантайме

dilmah ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.