Можно ли повысить производительность в языках на основе vm, написав код вручную в их сборке? - PullRequest
2 голосов
/ 02 апреля 2012

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

Ответы [ 3 ]

3 голосов
/ 02 апреля 2012

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

0 голосов
/ 02 апреля 2012

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

0 голосов
/ 02 апреля 2012

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

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

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

Конечно, я говорю конкретно о MSIL, но я верю, что в целом это будет справедливо.

...