2012-03-27 2 views
4

Это больше о Node.JS, в котором используется двигатель V8. Это механизм JavaScript, который также используется для Google Chrome.V8 обнаруживает переменные int и обрабатывает их более эффективно?

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

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

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

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

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

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

+0

* «типы не кодируются для переменных» * - термин, который вы ищете здесь, * динамически типизирован * (в отличие от * статически типизированного *). См. [Система типов] (http://en.wikipedia.org/wiki/Type_system). – josh3736

ответ

3

Одним словом: Yes.

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

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

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

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

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

EDIT: Но, конечно же, статически типизированный язык, как Java будет оптимизировать как большая часть кода, насколько это возможно во время компиляции, так что должен опережать Javascript во всех, кроме игрушечных тестов. Тем не менее, V8 закрывает пробел между ними, и Javascript гораздо более «забавен» для написания, чем Java или C++, поэтому первоначальное прототипирование или разработка программ, где пользователь является самым большим источником латентности, означает, что Javascript часто является лучшим выбором , по моему мнению.

+0

, в то время как ваше описание верное в духе, оно содержит много вводящей в заблуждение или неправильной информации о V8.например: V8 компилируется в машинный код с одним не оптимизирующим компилятором (не в байт-код), а затем во время выполнения программ V8 пытается увидеть горячие функции, которые обнаруживаются и оптимизируются по детализации функции (это цикл или ветвь if не может быть оптимизированная отдельно, функция всегда оптимизируется как целая [V8 может или не может вставлять безусловную деоптимизацию в пути кода, которые не выполнялись, но это трюк реализации)). –

+0

Я бы сказал, что здесь есть три существенные вещи: 1) V8 способен выполнять вывод типа/диапазона/представления внутри функции, которую он оптимизирует. 2) V8 способен делать оптимистичные предположения о типах/диапазонах/представлениях переменных и проверках вставки что приведет к деоптимизации *, если предположения не выполняются. 3) Глобальная нумерация значений может устранить и проверить подъем, чтобы минимизировать влияние. –

+0

@ Вячеслав Егоров: Вы уверены в этом? [На странице, с которой я связан, говорится, что существует промежуточный код под названием «Литий», используемый V8] (http://wingolog.org/archives/2011/08/02/a-closer-look-at-crankshaft-v8s- оптимизатор-компилятор) –

Смежные вопросы