Защо минимизираният или обфусцираният JavaScript работи по-лошо от некомпресирания код?

Попаднах на този отчет за ефективността на JavaScript код, компресиран с помощта на различни минификатори и обфускатори . Това, което е изненадващо е, че освен разширения режим на затваряне, в повечето случаи всички други минификатори извеждат код, който се представя по-лошо от некомпресирания код. Как да си обясним това?

Превъртете надолу до края на страницата, за да видите отчета. Ето екранни снимки:

въведете описание на изображението туквъведете описание на изображението тук въведете описание на изображението туквъведете описание на изображението тук

Легенда:

  • Син - YUI Compressor
  • Червено - Затваряне (разширен режим)
  • Оранжево - Затваряне (основен режим)
  • Зелено - JS Мин
  • Лилаво - JS Packer
  • Светло синьо - UglifyJS
  • Розово - Некомпресиран код

person Dheeraj Vepakomma    schedule 17.03.2013    source източник
comment
възможен дубликат на Има ли спад в производителността при изпълнение на обфусциран код?   -  person Barmar    schedule 17.03.2013
comment
Това всъщност не е дубликат на @Barmar - да, става дума за обфускация, но говори за Java и C#, а не за JavaScript.   -  person nnnnnn    schedule 17.03.2013
comment
Защо е необходимо да се сравнява обфускацията с производителността? Ако някой почувства необходимостта да обфускира кода си, не мисля, че производителността ще бъде въпрос.   -  person Ozzy    schedule 17.03.2013
comment
Не съм сигурен, че операциите peer second наистина са страхотен показател... Със сигурност това просто показва кой обфускатор предпочита най-простите операции и не казва нищо за скоростта на кода като цяло...   -  person David McMullin    schedule 17.03.2013
comment
@Ozzy, обфускацията/компресията в JS е по-скоро за намаляване на количеството данни, които трябва да бъдат изпратени до браузъра. Това кара страницата да се зарежда по-бързо, разбира се, вие също ще се притеснявате да работи по-бързо.   -  person David McMullin    schedule 17.03.2013
comment
@DavidMcMullin и това се прави по-ефективно чрез компресиране на файла, вместо обфускация, което може да доведе до грешки. yuiblog.com/blog/2006/03/06/minification-v - объркване   -  person Ozzy    schedule 17.03.2013
comment
@Ozzy Това не е единият или другият въпрос, ако направите и двете, ще получите най-малкия размер на файла и най-бързото време за зареждане.   -  person David McMullin    schedule 17.03.2013
comment
Ако компресорът опакова кода по начин, по който първо трябва да се разопакова, тогава очевидно има допълнителни разходи за това. Освен това, например, компресорите могат да заменят повтарящи се имена на функции с низове (a = 'getElementById'; document[a]();), което вероятно има много различни характеристики на производителност.   -  person deceze♦    schedule 17.03.2013


Отговори (3)


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

JS Packer не произвежда JavaScript код, а по-скоро компресиран текст, който трябва да бъде разопакован по време на изпълнение. Ето защо е много по-бавно. Google Closure с помощта на Advanced Optimization замества идентификаторите, когато е възможно. Така че вече трябва да има предимство в производителността при анализиране на скрипта.

Това каза, че е възможно да се жертва производителността за размера на кода. Един пример е замяната на true и false с !0 и !1. Все пак зависи от двигателя на JavaScript. Може да се оптимизира от двигателя преди първото обаждане, след него, след няколко обаждания, никога ... кой знае ;)

Нови открития

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

Комбинирайте това с факта, че кодът не прави много и имате нещо. В един тест имах процесорно време за събиране на боклук от около 3% за некомпресиран и 9%(!) за JSMin. Което означава напълно различни резултати за почти еднакъв код.

Още по-нови открития

Когато стартирате първо JSMin, той е по-бърз от некомпресиран. Опитах това няколко пъти и винаги получавах същия резултат. Това потвърждава предишните открития. Вече съм доста уверен, че намерихме решението.

person a better oliver    schedule 17.03.2013
comment
+1 за кода, който не прави нищо. Единствените показатели, които имат значение, са вашите собствени. - person David McMullin; 17.03.2013
comment
Разбира се, кодът наистина не изпълнява нищо. Така че не е представителен за добър бенчмарк. И все пак защо минимизираният код се представя по-зле за този конкретен тест? JSMin, по-специално, просто пропуска някои интервали. Така че защо трябва да се представя по-зле? - person Dheeraj Vepakomma; 17.03.2013
comment
Дори има резултати, при които производителността на JSMin е равна на некомпресираната версия. Но работата на JSMin също ми се струва странна. Отделно от това трябва да вземем предвид 3 въпроса: 1. Разбор: Изграждането на AST отнема своя дял от времето, особено за този скрипт. 2. Всичко зависи от JavaScript Engine. Резултатите варират силно. 3. Самата рамка или начинът, по който прави бенчмарковете, може да окаже влияние в този случай. Не мисля, но не мога да кажа със сигурност. - person a better oliver; 17.03.2013
comment
Боя се, че за да се обясни всяка разлика, ще е необходимо участието на доставчиците на браузъри. Или проверка на изходния код на JS двигателите;) - person a better oliver; 17.03.2013

Изглежда може по невнимание да сте объркали минимизирането с обфускацията.

За да разбера двете технологии, ще ги обясня поотделно.

Минимизирането е процес, при който размерът на изходния файл се намалява и се превръща във формат, предназначен за по-ефективна машинна четимост. Това става чрез (а) премахване на коментари и ненужни интервали и евентуално (б) замяна на имена на променливи с прости, инкрементални имена на променливи, често започващи с един знак. Полученият код все още функционира по същия начин като оригиналния код, но теоретично е по-бърз за анализиране и компилиране от браузъра.

Обфускацията е техника, при която кодът се модифицира, така че вече да не се разпознава като оригиналния изходен код, и често се използва за обезсърчаване на обратното инженерство на патентован код. Някои от промените може да имат допълнителни разходи, например кодът може да бъде шифрован и след това отново дешифриран по време на изпълнение. Въпреки това е типично за обфускатор на код също да завърши работата чрез минимизиране на изхода.

Човек може да приеме минимизирането за груба форма на обфускация, но обикновено такива процеси се извършват повече за целите на производителността и/или честотната лента.

person William    schedule 12.12.2015

Да, обфускацията може да причини някои проблеми с производителността, но не е вярно, че минимизираният код се представя по-лошо от некомпресирания. Всъщност минимизираният код се представя по-добре от некомпресирания. Това е така, защото minfied кодът има много по-кратко име на променлива/функция, което прави много по-лесно препращането към разпределеното пространство в паметта!

person spaceman12    schedule 17.03.2013