Как Google Dart может получить лучшую производительность? - PullRequest
7 голосов
/ 25 сентября 2011

Я прочитал статью о грядущем языке Google DASH / DART , что показалось мне довольно интересным.

Одна вещь, на которую я наткнулся, заключается в том, что они говорят, что они уберут внутреннюю производительностьпроблемы JavaScript.Но что это за проблемы с производительностью?В тексте нет примеров.Это все, что он говорит:

  • Производительность - Dash разработан с учетом характеристик производительности, так что можно создавать виртуальные машины, которые не имеют проблем с производительностью, которые должны иметь все виртуальные машины EcmaScriptесть.

Есть ли у вас какие-либо идеи о том, что эти внутренние проблемы производительности?

Ответы [ 3 ]

8 голосов
/ 27 сентября 2011

Эта тема обязательна для прочтения всем, кто интересуется динамическим языком как раз во время компиляторов: http://lambda -the-ultimate.org / node / 3851

Участники этой темыявляются создателями luajit, разработчиками pypy, разработчиками javascript для Mozilla и многими другими.Обратите особое внимание на комментарии Майка Полла (он является создателем luajit) и его мнения о javascript и python в частности.Он говорит, что языковой дизайн влияет на производительность.Он придает большое значение простоте и ортогональности, избегая, например, безумных угловых случаев, которые чумы в JavaScript.

Здесь обсуждается много разных методов и подходов (отслеживание джитов, джитов методов, интерпретаторов и т. Д.).Проверьте это!

Луис

6 голосов
/ 27 апреля 2013

В статье говорится о трудностях оптимизации, возникающих из-за чрезвычайно динамичных языков, таких как JavaScript, плюс наследование прототипов.

В таких языках, как Ruby или JavaScript, структура программы может изменяться во время выполнения.Классы могут получить новый метод, функции могут быть созданы eval () и многое другое.Это усложняет время выполнения для оптимизации их кода, потому что никогда не гарантируется, что структура будет задана.

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

Интересно, что V8 (движок JavaScript Chrome) использует скрытые классы как часть своей стратегии оптимизации.Конечно, JS не имеет классов, поэтому в V8 макет объекта более сложный.

Макет объекта в V8 требует минимум 3 слов в заголовке.В отличие от виртуальной машины Dart требуется всего 1 слово в заголовке.Размер и структура объекта Dart известны во время компиляции.Это очень полезно для разработчиков виртуальных машин.

Другой пример: в Dart есть реальные списки (или массивы).У вас может быть список фиксированной длины, который проще оптимизировать, чем нереальные массивы JavaScript и всегда переменной длины.

Подробнее о компиляции Dart (и JavaScript) в эффективный код с этой презентацией: http://www.dartlang.org/slides/2013/04/compiling-dart-to-efficient-machine-code.pdf

Другим аспектом производительности является время запуска.По мере усложнения веб-приложений количество строк кода увеличивается.Конструкция JavaScript усложняет оптимизацию запуска, потому что синтаксический анализ и загрузка кода также выполняет код.В Dart язык был тщательно разработан, чтобы его можно было быстро проанализировать.Dart не выполняет код, так как загружает и анализирует файлы.

Это также означает, что виртуальные машины Dart могут кэшировать двоичное представление проанализированных файлов (называемое снимком) для еще более быстрого запуска.

5 голосов
/ 25 сентября 2011

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

Устранение вызова в хвосте не совместимо с JavaScript, поскольку используется в реальном мире.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...