Можно ли повысить производительность в языках на основе vm, написав код вручную в их сборке?

Я знаю, что, вероятно, не имеет смысла делать это, так как обычно быстрее и логичнее просто переписывать критичные для производительности разделы на более быстром языке, но, если оставить в стороне, можно ли писать более быстрые программы на CPython/JVM/CLR с помощью писать части прямо в их сборке?

3 ответа

Решение

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

Нет, это не рекомендуется. Например, функция компиляции Just-In-Time в некоторых JVM ищет шаблоны байт-кода для их значительной оптимизации во время выполнения. Если вы замените их собственным скрученным байт-кодом, JIT может не сработать, и у вас получится более медленный код. Это то, что иногда случается, когда вы запутываете программы Java.

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

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

Также важно отметить, что если вы генерируете необычный код - скажем, в некотором стековом vm вы замечаете, что значение используется дважды, и, будучи умным, а не испуская временную переменную, вы оставляете его в стеке и дублируете его позже... вы ' Возможно, просто сильно ударил по производительности. JIT больше не распознает идиому и в результате выдает ужасный код. Я был поражен этим генерируемым MSIL во время выполнения, генерируемым во время выполнения - если то, что вы излучаете, не похоже на сгенерированный компилятором код, оно, вероятно, не будет работать

Конечно, я говорю конкретно о MSIL, но я верю, что в целом это произойдет.

Другие вопросы по тегам