Оптимизация производительности JavaScript через пользовательское выделение памяти функций

Перевод статьи Optimizing JavaScript Performance Through Custom Memory Allocation с любезного согласия Kevin Dangoor

Каннан Виджаян из компании Mozilla был заинтригован результатами запуска SunSpider, перенесенного на C++, asm.js и dalvik. В тесте “бинарные деревья”, asm.js показал себя самым быстрым на сегодняшний день. Непроверенная теория Каннана сводится к производительности выделения памяти:

В asm.js, скомпилированный C++ выполняется через типизированный массив JavaScript как “машинная память”. Машинная память выделяется один раз и затем используется для всей программы во время выполнения. Вызовы на malloc от asm.js не выполняют никаких системных вызовов. Это может быть причиной того, что расширенный с помощью asm.js JS-код, который компилируется в C++ лучше, чем в родной-компиляции C++, но эта гипотеза требует дальнейших исследований в работе функций для подтверждения.

В дискуссии на Hacker News были некоторые комментарии касательно производительности памяти в javascript. duaneb сказал:

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

Некоторые разработчики повторно используют объекты как способ избежать ненужных выделений. Статья была только-только опубликована на Smashing Magazine. Говоря о Emmet LiveStyle, автор рассказывает о том, как они повторно использовал объекты в целях экономии ассигнований. Другие подробности также содержатся в справочнике по javascript.

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

Обновление: Вячеслав Егоров послал мне ссылку на график Каннана, где содержатся данные о производительности движка JavaScript (см. также справочник javascript). В случае с бинарным деревом, реализация JavaScript дала самые быстрые показатели на сегодняшний день. Хотя возможно, C++ не был оптимально настроен.

Я не хочу слишком зацикливаться на тестах, потому что мой главный смысл не в том “asm.js быстрее, чем c++” (на самом деле, я даже не завожу разговор об этом). Моя точка зрения состоит в том, что существуют способы управления памятью в функциях JS, которые могут быть неочевидным способом улучшения отзывчивости.