Как код dart2js быстрее, чем javascript?

Я пытаюсь лучше понять влияние дартс на производительность. На веб-сайте dart их тесты показывают, что код Dart, скомпилированный в Javascript, работает быстрее, чем просто Javascript. Как это возможно?

Tracer Benchmarks

Я понимаю, как виртуальная машина Dart быстрее, чем v8, но я не понимаю, насколько генерируемый dart2js javascript быстрее обычного старого javascript, когда оба работают в одной среде v8.

4 ответа

Решение

dart2js может выполнять оптимизации, которые обычно не добавляются вручную в код JavaScript.

В этом случае нет ничего особенно особенного в том, что Dart является исходным языком: любой автоматизированный инструмент, генерирующий JavaScript, должен это делать, например, это делает и компилятор GWT (Java to JavaScript). Конечно, вы можете запускать автоматизированные инструменты на источнике JavaScript, чтобы также генерировать лучший JavaScript, это то, что делает компилятор Closure.

Технически, вы можете вручную достичь той же скорости с рукописным JavaScript, если вы знаете все хитрости.

Одним из примеров является встраивание функций. Если вам нужен фрагмент кода, вызываемый повторно, вы бы перестроили его в функцию / метод. Dart2js часто делает наоборот. Вызовы методов часто заменяются фрагментом кода, содержащимся в вызываемой функции / методе, которая называется встраиванием. Если вы сделаете это вручную, это приведет к не поддерживаемому коду.

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

Вячеслав Егоров из команды дротиков сделал отличную презентацию, в которой он подробно объясняет некоторые оптимизации, в том числе и в подкладке.

http://www.infoq.com/presentations/dart-compiler

Резюме Вячеслав Егоров подробно описывает, как некоторые языковые возможности Dart повлияли на дизайн нового JIT Dart-компилятора и как движок V8 JavaScript повлиял на общий дизайн.

Есть интересное видео от Seth Ladd и Kasper Lund. Каспер участвует в создании компилятора Dart2js и приводит несколько примеров кода о том, как компилятор оптимизирует код Javascript.

Другие вопросы по тегам