Пострадает ли производительность JIT из-за возможности записи страниц? - PullRequest
2 голосов
/ 20 июля 2009

В книге Компоновщики и загрузчики упоминается, что одной из причин того, что исполняемые файлы имеют отдельный раздел кода, является то, что раздел кода можно хранить на страницах только для чтения, что приводит к увеличению производительности , Это все еще верно для современной ОС? Поскольку как раз вовремя, компиляторы генерируют код на лету, я предполагаю, что им нужны страницы с возможностью записи. Означает ли это, что сгенерированный JIT код всегда будет страдать от снижения производительности по сравнению? Если да, то насколько значим хит?

Ответы [ 3 ]

1 голос
/ 21 июля 2009

Увеличение производительности происходит не из-за того, что страницы предназначены только для чтения или нет. Преимущество состоит в том, что страницы, доступные только для чтения, могут быть разделены между процессами, поэтому вы используете меньше памяти, что означает меньшую подкачку (как в кешах L1 / L2 / L3, так и в крайнем случае на диск).

JIT пытается смягчить это, не бесполезно JITting, а только JITting горячих функций. Это приведет только к небольшому увеличению памяти, поскольку число горячих функций относительно невелико.

JIT-компилятор также может быть умным и кэшировать результат JITting, чтобы его (теоретически) можно было использовать совместно. Но я не знаю, делается ли это на практике.

1 голос
/ 21 июля 2009

За исключением эффектов управления памятью (которые объясняются в других ответах), CPU не нужно постоянно проверять, изменяется ли текущий поток инструкций, а промежуточные результаты в конвейере должны быть выброшены, а новый код должен быть читать. В случае jit-компиляции этот сценарий может часто происходить в зависимости от конструкции компилятора, глубины конвейера ЦП, размера кэша кода на ЦП и количества других ЦП, которые могут изменять этот код. Обычно это не допускается в хорошо спроектированных современных системах, где код генерируется на доступной для записи странице и впоследствии помечается как исполняемый и только для чтения. Это не уникально для JIT, конечно. Это может происходить во всех видах самоизменяющегося кода.

1 голос
/ 20 июля 2009

Да, должно произойти какое-то попадание, потому что код в памяти не поддерживается непосредственно исполняемым файлом, поэтому его придется выгружать, а не просто отбрасывать. Сказав это, различные формы ссылок могут также испортить обычные кодовые страницы, чтобы они больше не соответствовали образу диска, с такими же последствиями, поэтому я не уверен, что это имеет большое значение.

...