Какую оптимизацию современные механизмы JavaScript выполняют?

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

Фон:

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

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

15
задан Peter Mortensen 16 November 2014 в 20:23
поделиться

1 ответ

В данной серии статей рассматриваются оптимизации V8. Подводя итог:

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

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

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

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

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

15
ответ дан 1 December 2019 в 04:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: