V8 определяет переменные типа int и обрабатывает их более эффективно? - PullRequest
5 голосов
/ 27 марта 2012

Это больше о Node.JS, который использует движок V8.Это движок JavaScript, который также используется для Google Chrome.

Я слышал, что V8 работает очень быстро, не только для Node, но и для браузеров.Однако, одна вещь, которую я заметил в JavaScript, - это то, что типы не кодируются для переменных.

Для этого в Java вам понадобится тип переменной Object для всего.Это было бы значительно менее эффективно, например, в цикле for:

for (var i = 0; i < array.length; i++) {}

Мой вопрос: как V8 обрабатывает переменные типы?Знает ли он, что эта переменная i всегда является либо int, либо long?(Я считаю это маловероятным, потому что i++ имеет возможность преобразовать long в double.)

Или V8 обрабатывает вещи таким образом, что это не имеет значения?Я думаю, что некоторые простые примеры того, что может создать JIT-компилятор, были бы полезны.И Java, и JavaScript имеют JIT-компиляторы для преобразования кода в C.

Я не программист на C, но мне любопытно узнать, как обрабатываются типы, и действительно ли Java действительно более эффективна в этой области.(да, я знаю, что ввод / вывод будет гораздо более значительным для большинства программ, чем обработка типов)

1 Ответ

3 голосов
/ 27 марта 2012

Одним словом: Да.

V8 компилирует код в промежуточный байт-код, затем «горячие точки» анализируются компилятором «Crankshaft», и если он определяет, что некоторые переменные никогда не будут чем-то иным, кроме целого числа, двойного числа, строки и т. Д. on, он генерирует машинный код с «распакованным».

Эта оптимизация выполняется только на тех ветвях, которые уже пройдены; другие откладываются до тех пор, пока информация о реальных задействованных типах не будет вычислена «обычным» механизмом, а затем введена в оптимизированный код.

Кроме того, V8 может преобразовывать по существу статические иерархии прототипов в «классическое» наследование объектов в стиле C ++ для повышения производительности «сложных» типов.

Однако он может делать все это только в коде, который называется «часто»; как циклы или часто вызываемые функции.

Ссылка на статью (часть серии) объясняет это во многом, намного более подробно и, безусловно, стоит прочитать.

РЕДАКТИРОВАТЬ: Но, конечно же, статически типизированный язык, такой как Java, оптимизирует как можно большую часть кода во время компиляции, поэтому он должен опережать Javascript во всех, кроме игрушечных тестах. Тем не менее, V8 сокращает разрыв между ними, и написание Javascript намного «веселее», чем Java или C ++, поэтому первоначальное создание прототипа или разработка программ, где пользователь является источником наибольшей задержки, означает, что Javascript часто является лучшим выбором. по-моему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...