2010-01-13 1 views
15

К настоящему времени большинство основных браузеров приступили к интеграции оптимизирующих компиляторов JIT с их интерпретаторами/виртуальными машинами. Это хорошо для всех. Теперь мне было бы трудно узнать, какие именно оптимизации они выполняют, и как их лучше всего использовать. Что такое ссылки на оптимизацию в каждом из основных движков JavaScript?Какие оптимизаторы выполняют современные JavaScript-движки?

фон:

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

Один из примеров: из моего разума: язык, который я собираю, в скором времени включит поддержку лени. Могут ли двигатели JIT хорошо себя вести с ленивыми определениями функций?

+3

Лично я считаю, что лучший способ, чтобы воспользоваться компилятор/JIT оптимизаций является просто генерировать код, как естественно, читаемыми , и, насколько это возможно, можно поддерживать, и пусть компилятор/jit работают, это волшебство. Любая попытка специально ориентировать оптимизацию компилятора, скорее всего, приведет к уменьшению количества поддерживаемых кодов, и через год или два, когда все компиляторы будут изменены, ваши оптимизации больше не будут действительны. –

+0

Хорошо, читаемый/поддерживаемый код на самом деле не является моей целью. Я компилирую с языка, который сильно отличается от JS, поэтому я не ожидаю, что кто-нибудь сделает много чтения на сгенерированном JS. Что касается JIT-магии и недействительности оптимизаций, ну да, у вас есть точка. – Yoric

ответ

15

This article series обсуждает оптимизацию V8. В итоге:

  • Он генерирует машинный код - не байткодом (V8 Design Elements)
  • Precise коллекция мусора (Wikipedia)
  • Инлайн кэширование затребованных методов (Wikipedia)
  • Storing Переменная класса информация, так что объекты с одинаковыми свойствами группируются вместе (V8 Design Elements)

Первые две точки могут не помочь вам в этом. Третий может показать понимание того, как все вещи собраны вместе. Последнее может помочь вам создать объекты с одинаковыми свойствами, чтобы они использовали одни и те же скрытые классы.

This blog post обсуждает некоторые из оптимизаций из SquirrelFish Extreme:

  • ByteCode оптимизации
  • полиморфных встроенного кэш (например, V8)
  • Контекста резьбовой JIT (введение нативной генерации машинного кода, как V8)
  • Регулярное выражение JIT

TraceMonkey is optimised via tracing. Я не знаю много об этом, но похоже, что он обнаруживает тип переменной в некотором «« горячем » (часто выполняется код в циклах) и создает оптимизированный код, основанный на типе этой переменной. Если тип переменной изменяется, он должен перекомпилировать код, основанный на этом, я бы сказал, что вам следует избегать изменения типа переменной в цикле.

+1

Точная сборка мусора? ...: S –

+0

Интересно, спасибо. Мне нужно взглянуть на переходы классов. Теперь, на другие браузеры :) – Yoric

+0

V8 материал прочитан. TM прочитал. SF прочитал. Сторона примечания: описанные методы СФ выглядят, ну, что-то неутешительное. Особенно, как описано, их Context Threading выглядит намного глубже, чем большинство методов JIT, о которых я знаю. – Yoric