Сабж. Не прошло и года, как они догадались, что в итоге packer замедляет общую скорость работы JS на клиенте. Причем, замедление происходит в двух местах:
- Распаковка скрипта. Да, eval медленная штука, а eval таких объемов данных – очень медленная штука. В итоге получается, что «полезный» код начинает работать позже, чем если бы он был minified, даже с учетом того, что уpackованный скрипт загружается быстрее.
- После того, как была такая нагрузка на движок JS, и было занято столько памяти под распаковку, некоторое время движок не сможет работать в полную скорость – пока не отработает сборщик мусора, да и некоторое количество памяти все равно будет занято под изначальный код скрипта. И в итоге и работать скрипт будет медленнее, если браузер получит его упакованным в packer.
О таких «мелочах», что уpackованный скрипт в разы труднее дебажить, и упоминать не будем.
Короче, хорошо, что ребята перешли на использование моего любимого YUI Compressor‘a. Вообще, мне полагается сейчас скакать до потолка с криками «А я ведь говорил, я знал, я ЗНАЛ!». Но, так как письменных свидетельств того, что я уже неоднократно негативно высказывался об упаковке JS packer’ом не осталось (кроме как в асечных логах), то придется скромно промолчать :)
а есть еще извраты которые дебажа пакованые скрипты? оО
Ну вот прямо сейчас не знаю, но не так давно – полгода-год назад и мне приходилось :)
В то время мы еще пользовались richfaces, огребая по этому поводу кучу проблем.
Мне кажется Вы не туда стреляете.
1) Eval медленнее большинства операций языка потому что занимается синтаксическим разбором, а это довольно не быстрая вещь. Но eval не будет работать медленнее (так чтобы это было заметно) разбора того же [объема] js-кода заключенного в тег script.
В любом случае можно реорганизовать packer, так чтобы он писал распакованный код в тег скрипт, — и тогда на eval уж точно не попеняешь.
2) А вот насчет сборщика мусора совсем интересно — что-же, если я выделю объем памяти эквивалентный объему занимаемому packerнутому скрипту, (создав, например, здоровенный массив, или лучше строку) — я гарантированно получу те же тормоза?
1) Возможно, возможно. Вообще, по субъективным ощущениям eval теряет скорость не только на синтаксическом разборе – очень уж по разному он работает в разных браузерах. Но в любом случае, код, пожатый packer'ом, будет работать медленней даже и без eval – он ведь предполагает вычисление перед работой.
2) Насколько говорит мой опыт – да. Особенно плотно я столкнулся с этим, когда делал поиск и сортировку в этом проекте. Очень четко видно, что, если кешировать промежуточные результаты, то при достаточно большом увеличении кеша, движок JS просто парализуется. Исходя из этого, я составил для себя такое правило – если использование кеша не критично с точки зрения алгоритма (и размер кеша предпожительно большой), то быстрее будет вывести значение заново, нежели кешировать его.