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

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


person Llamageddon    schedule 02.04.2012    source источник


Ответы (3)


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

person harold    schedule 02.04.2012
comment
Для меня это звучит как очень конкретный случай, но если бы я знал лучше, я бы не спрашивал ^^ - person Llamageddon; 02.04.2012
comment
@Asmageddon хорошо, это пример. Компиляторы C# и Java не делают много оптимизаций и вместо этого полагаются на JIT-компилятор для исправления ситуации, который иногда тоже этого не делает (возможно, потому, что он не может тратить слишком много времени на анализ). В таких случаях вы можете помочь JIT, написав более умный IL. - person harold; 02.04.2012
comment
Звучит логично. Как вы относитесь к двум другим ответам? - person Llamageddon; 02.04.2012
comment
@Asmageddon, на самом деле они не ошибаются, но, по моему мнению, они избегают ответа на реальный вопрос. Конечно, трудно найти ситуации, когда это помогает, а не рекомендуется и все такое ... но ответ все равно должен быть да, вы можете в некоторых случаях. - person harold; 02.04.2012

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

person H-H    schedule 02.04.2012
comment
Не рекомендуется не невозможно. Вы всегда можете написать то же самое, что и компилятор, поэтому вы не сделаете хуже, если только вы не сделаете это неправильно. - person harold; 02.04.2012

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

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

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

Конечно, здесь я говорю конкретно о MSIL, но я верю, что в целом это так.

person Mania    schedule 02.04.2012
comment
Downvoter, могу я спросить, почему? Мой ответ очень похож на HH, на мой взгляд. - person Mania; 02.04.2012
comment
Я, вероятно, должен был добавить, что вы можете получить процент в любом случае. Я предположил, что мы говорим здесь об заметном приросте производительности, таком, который может гарантировать использование байт-кода, а не о приросте в 1-2%, который ни один пользователь никогда не заметит. - person Mania; 02.04.2012