Я знаю, что, вероятно, не имеет особого смысла делать это, так как обычно быстрее и логичнее просто переписать критически важные для производительности разделы на более быстром языке, но если оставить это в стороне, возможно ли написать более быстрые программы CPython/JVM/CLR с помощью написание порций прямо в их сборке?
Можно ли добиться производительности в языках на основе vm, написав код вручную в их сборке?
Ответы (3)
На самом деле это так. Не часто обращайте на это внимание, но я знаю по крайней мере один случай (пропуская and
в MSIL немного ускоряет этот код). Вероятно, есть и другие случаи, компилятор CLR JIT не так уж и умен.
Нет, не рекомендуется. Например, функция компиляции Just-In-Time в некоторых JVM ищет шаблоны байт-кода, чтобы значительно оптимизировать их во время выполнения. Если вы замените их своим собственным искаженным байт-кодом, JIT может не работать, и вы получите более медленный код. Это то, что иногда происходит, когда вы запутываете Java-программы.
Нет. Байт-код для большинства языков высокого уровня имеет очень высокий уровень и обычно хорошо соответствует тем идиомам, которые использует язык — вы просто не можете написать код для выполнения простой задачи каким-либо образом, кроме того, что компилятор уже выдает, по крайней мере не без замедления.
Наибольшее ускорение ассемблера, созданного вручную, происходит за счет разумного использования регистров, разумного использования машинных кодов операций и т. д. - всего, что вы не можете контролировать при написании байт-кода высокого уровня.
Также важно отметить, что если вы выдаете необычный код — скажем, в какой-то виртуальной машине на основе стека вы замечаете, что значение используется дважды, и, будучи умным, вместо того, чтобы выдавать временную переменную, вы оставляете ее в стеке и обманываете позже. возможно, я просто сильно ударил по производительности. JIT больше не распознает идиому и в результате выдает ужасный код. Я был поражен этой генерируемой средой выполнения MSIL из первых рук: если то, что вы выдаете, не похоже на сгенерированный компилятором код, оно, вероятно, не будет выполняться.
Конечно, здесь я говорю конкретно о MSIL, но я верю, что в целом это так.