Подтвердить что ты не робот

Почему миниатюрный или запущенный JavaScript работает хуже, чем несжатый код?

Я встретил этот отчет об эффективности кода JavaScript, сжатого с использованием различных minifiers и обфускаторов. Что удивительно, так это то, что помимо расширенного режима Closure, в большинстве случаев все остальные minifiers выходные коды работают хуже, чем несжатый код. Как мы это объясним?

Прокрутите вниз до конца страницы чтобы просмотреть отчет. Вот скриншоты:

enter image description hereenter image description hereenter image description hereenter image description here

Легенда:

  • Blue - Компрессор YUI
  • Красный - Закрытие (расширенный режим)
  • Оранжевый - Закрытие (основной режим)
  • Зеленый - JS Мин
  • Фиолетовый - JS Packer
  • Голубой - UglifyJS
  • Розовый - несжатый код
4b9b3361

Ответ 1

Сначала позвольте мне играть адвоката дьявола: код на самом деле ничего не выполняет (ничего серьезного я имею в виду, кроме JS Packer). Это, по сути, определение функций, объектов и свойств.

JS Packer не создает код JavaScript, а скорее сжатый текст, который необходимо распаковать во время выполнения. Вот почему он намного медленнее. Google Closure с использованием расширенной оптимизации заменяет идентификаторы, когда это возможно. Поэтому при анализе script должно быть преимущество производительности.

Тем не менее, можно пожертвовать производительностью для размера кода. Одним из примеров является замена true и false на !0 и !1. Однако это зависит от механизма JavaScript. Он может быть оптимизирован движком до первого вызова после него после некоторых вызовов, никогда... кто знает;)

Новые результаты

Я сделал некоторое профилирование тем временем и понял, что я забыл одно: сбор мусора. Влияние может быть достаточно, чтобы объяснить некоторые различия между сценариями и браузерами (разные двигатели!).

Объедините это с тем, что код мало что делает, и у вас что-то есть. В одном тесте у меня было время процессора для сбора мусора около 3% для несжатого и 9% (!) Для JSMin. Это означает совершенно разные результаты для почти равного кода.

Еще более новые результаты

Когда вы запускаете JSMin сначала, он быстрее, чем несжатый. Я пробовал это несколько раз и всегда получал тот же результат. Это подтверждает предыдущие выводы. Теперь я уверен, что мы нашли решение.

Ответ 2

Да, обфускация может вызвать некоторые проблемы с производительностью, но неверно, что минифицированный код работает хуже, чем несжатый. Фактически, минифицированный код работает лучше, чем несжатый. Это связано с тем, что минимальный код имеет гораздо более короткое имя переменной/функции, что значительно упрощает обращение к выделенному пространству памяти!

Ответ 3

Кажется, у вас может быть непреднамеренно запутанная минификация с обфускацией.

Чтобы понять две технологии, я объясню их отдельно.

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

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

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