К настоящему времени самые основные браузеры начали интегрировать JIT-компиляторы оптимизации к своим интерпретаторам/виртуальным машинам JavaScript. Это хорошо для всех. Теперь, мне было бы трудно знать точно, какую оптимизацию они действительно выполняют и как лучше всего использовать в своих интересах их. Что такое ссылки на оптимизации в каждом из главных механизмов JavaScript?
Фон:
Я работаю над компилятором, который генерирует JavaScript с высокоуровневого и более безопасного языка (бесстыдный разъем: это назвало OPA, и это очень прохладно), и, учитывая размер приложений я генерирую, я хотел бы, чтобы мой код JavaScript был настолько быстр и эффективен памятью насколько возможно. Я могу обработать высокоуровневую оптимизацию, но я должен знать больше, о котором выполняются преобразования во время выполнения, чтобы знать, какой код низкого уровня приведет к лучшим результатам.
Один пример, от вершины моего ума: язык, который я компилирую, скоро интегрирует поддержку лени. Механизмы JIT ведут себя хорошо с ленивыми функциональными определениями?
В данной серии статей рассматриваются оптимизации V8. Подводя итог:
Первые два пункта могут не очень помочь в этой ситуации. Третья может показать понимание того, как кэшировать вещи вместе. Последнее может помочь вам создать объекты с одинаковыми свойствами, чтобы они использовали одни и те же скрытые классы.
В посте этого блога обсуждаются некоторые из оптимизаций SquirrelFish Extreme:
TraceMonkey оптимизируется с помощью трассировки. Я мало что об этом знаю, но похоже, что оно обнаруживает тип переменной в каком-то "hot code" (код, который часто выполняется в циклах) и создает оптимизированный код, основываясь на том, что это за тип переменной. Если тип переменной меняется, то он должен перекомпилировать код - исходя из этого, я бы сказал, что следует держаться подальше от изменения типа переменной внутри цикла.