Производительность GAS медленнее, чем на других серверных JavaScript

Работая на сайте Google Sites, который берет данные из электронной таблицы и динамически создает несколько диаграмм, я упомянул, что Google Apps Script работает довольно медленно. Я профилировал код и оптимизировал его, используя Cache Сервис, где это возможно. После оптимизации код диаграммы занимает ок. 3 сек. (2759 мс - одно из самых быстрых времен, которое я когда-либо видел), чтобы нарисовать 11 диаграмм, имеющих 127 строк. И это время для случая, когда все данные помещаются в кеш. Первое время выполнения, которое извлекает данные из электронной таблицы и помещает их в кеш, составляет около 10 секунд. Профилированный код требовал достаточно времени (десятки миллисекунд) в простых местах. Чтобы измерить производительность GAS, я написал очень простую процедуру и выполнил ее в среде GAS, как развернутое веб-приложение, и в Caja Playground, Кроме того, я отправил issue в отслеживание проблем GAS.

Эрик Коледа разумно упоминается, что неправильно сравнивать код сервера с кодом, запущенным на клиенте. Я переписал базовый код, и вот результаты. Подробности и пояснения следующие.

Engine          |List To Map|Adjust|Quick Sort|Sort|Complete|
GAS             |        138|   196|       155|  38|     570|
rhino-1.6.5     |         67|    44|        31|   9|     346|
spidermonkey-1.7|         40|    36|        11|   5|     104|
  • GAS - строка, содержащая времена выполнения различных функций, запущенных в движке GAS. Все время в миллисекундах. Время выполнения ГАЗ задерживается в довольно широких пределах. В таблице самые быстрые времена, которые у меня были в 5-10 исполнении. Самое худшее время Complete, которое я видел, составляло 1194 мс. Исходный код здесь. Результаты здесь.
  • rhino-1.6.5 и spidermonkey-1.7 - строки содержат время выполнения тех же функций, что и GAS, но выполняются на соответствующих механизмах Javascript, используя ideone.com. Код и время для этих движков здесь и здесь.

Контрольный код содержит несколько функций.

  • List To Map [listToMap] - функция, которая преобразует список объектов в карту, содержащую составной ключ. Он взят с сайта Script и занимает ок. 9,2% (256 из 2759 мс) графического кода.
  • Adjust [adjustData_] - функция, которая преобразует все столбцы дат в матрицу в текст в предопределенном формате, переносит ее и преобразует строки из формы [[[a], [1]], [[b], [2]]] в [[a, 1], [b, 2]]. Он также берется из Script и потребляет ок. 30,7% (857 из 2759 мс).
  • Sort - стандартная функция Array.sort, она включена в тест, чтобы увидеть, как быстро работают стандартные функции.
  • Quick Sort [quick_sort] - функция быстрой сортировки, принятая здесь. Он добавляется к эталону для сравнения с временем выполнения функции Array.sort.
  • Complete [test] - функция, которая включает вызовы функций, подготовку тестовых данных и упомянутые выше функции. На этот раз не резюме времени в raw.

Заключение: Время выполнения функций функции GAS дрейфует. Функция GAS Complete работает 1,6 раз медленнее, чем у самого медленного конкурента. Стандартная функция Array.sort стандарта GAS 4 раз медленнее, чем самый медленный из двух других двигателей. Сервис List To Map и Adjust в целом 3 раза медленнее (334 мс против 111 мс), чем самый медленный участник. Функции принимают 39,2% (1113 из 2759 мс) функции построения диаграмм. Я не ожидал, что эти функции будут работать так медленно. Их можно оптимизировать, например, используя кеш. Предположим, что после оптимизации время выполнения этих функций будет 0 мс. В этом случае выполнение функции построения графика составляет 1646 мс.

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

Ответ 1

Мне удалось воспроизвести эту производительность, и я отправлю обновления по этой проблеме по мере их получения.