Какие оптимизации выполняют современные движки JavaScript? - PullRequest
15 голосов
/ 13 января 2010

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

Справочная информация:

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

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

Ответы [ 2 ]

15 голосов
/ 13 января 2010

В этой серии статей обсуждается оптимизация V8. В итоге:

  • Генерирует собственный машинный код - не байт-код ( V8 Design Elements )
  • Точный сборщик мусора ( Википедия )
  • Встроенное кэширование вызванных методов ( Wikipedia )
  • Хранение информации о переходе класса , чтобы объекты с одинаковыми свойствами группировались вместе ( V8 Элементы дизайна )

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

В этом блоге обсуждаются некоторые оптимизации SquirrelFish Extreme:

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

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

1 голос
/ 09 июня 2011

Я нашел дополнительный ресурс:

...