2013-03-17 10 views
19

Mi sono imbattuto in this performance report di codice JavaScript compresso utilizzando vari minifiers e offuscatori. Ciò che sorprende è che, a parte la modalità avanzata di chiusura, nella maggior parte dei casi tutti gli altri minificatori emettono un codice che produce risultati peggiori rispetto al codice non compresso. Come lo spieghiamo?Perché JavaScript minified o offuscato ha un rendimento peggiore del codice non compresso?

Scorrere fino alla fine dello page per visualizzare il rapporto. Qui ci sono le immagini:

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

Legenda:

  • Blu - YUI Compressor
  • Red - Chiusura (modalità avanzata)
  • Orange - Chiusura (modalità base)
  • Verde - JS Min
  • Viola - JS Packer
  • Azzurro - UglifyJS
  • Rosa - Codice compresso
+0

possibile duplicato di [Vi è un problema di prestazioni durante l'esecuzione di codice offuscato?] (Http://stackoverflow.com/questions/2646216/is-there-a-performance-hit-when-running-obfuscated-code) – Barmar

+8

Questo non è proprio un duplicato @Barmar - sì, si tratta di offuscamento, ma parla di Java e C#, non di JavaScript. – nnnnnn

+0

Perché è necessario confrontare l'offuscamento con le prestazioni? Se qualcuno sente la necessità di offuscare il loro codice, non penso che la performance sarà una domanda. – Ozzy

risposta

7

Innanzitutto fammi fare l'avvocato del diavolo: il codice in realtà non "esegue" nulla (niente di serio intendo, tranne per JS Packer). È essenzialmente una definizione di funzioni, oggetti e proprietà.

JS Packer non produce codice JavaScript ma piuttosto testo compresso che deve essere decompresso in fase di runtime. Ecco perché è molto più lento. Google Closure che utilizza l'ottimizzazione avanzata sostituisce gli identificatori quando possibile. Quindi, deve già esserci un vantaggio in termini di prestazioni durante l'analisi dello script.

Detto questo è possibile sacrificare le prestazioni per le dimensioni del codice. Un esempio è la sostituzione di true e false con !0 e !1. Tuttavia dipende dal motore JavaScript. Potrebbe essere ottimizzato il motore prima della prima chiamata, dopo che, dopo qualche telefonata, mai ... chi lo sa;)

Nuove scoperte

ho fatto un po 'di profilazione nel frattempo e si rese conto che ho ho dimenticato una cosa: la garbage collection. L'influenza può essere sufficiente per spiegare alcune delle differenze tra gli script e i browser (diversi motori!).

Combina questo al fatto che il codice non fa molto e tu hai qualcosa. In un test ho avuto un tempo CPU per la garbage collection di circa il 3% per non compresso e il 9% (!) Per JSMin. Il che significa risultati completamente diversi per un codice quasi uguale.

risultati ancora più recente

Quando si esegue JSMin primo è più veloce di non compresso. L'ho provato diverse volte e ho sempre ottenuto lo stesso risultato. Questo conferma i risultati precedenti. Sono abbastanza fiducioso ora, che abbiamo trovato la soluzione.

+2

+1 perché il codice non sta facendo nulla. Gli unici parametri che contano sono i tuoi. –

+0

Certo, il codice in realtà non "esegue" nulla. Quindi non è rappresentativo di un buon benchmark. Ancora, perché il codice minified si comporta peggio * per questo particolare test *? JSMin, in particolare, [omette semplicemente alcuni spazi] (http://www.crockford.com/javascript/jsmin.html). Quindi perché dovrebbe peggiorare? –

+0

Esistono anche risultati in cui le prestazioni di JSMin sono uguali alla versione non compressa. Ma le prestazioni di JSMin mi sembrano strane. A parte questo, dobbiamo considerare 3 numeri: 1. Analisi: costruire l'AST prende la sua parte del tempo, per questo script in particolare. 2.Tutto dipende dal motore JavaScript. I risultati variano pesantemente. 3. La struttura stessa, o il modo in cui esegue i benchmark, ** potrebbe ** avere un'influenza in ** questo ** caso. Io non la penso così, ma non posso dirlo con certezza. – zeroflagL

-1

Sì, offuscamento può causare alcuni problemi di prestazioni, ma non è vero che il codice minimizzato eseguire peggio di quello non compresso. In effetti, il codice minified ha prestazioni migliori rispetto a quello non compresso. Questo perché, il codice miniato ha un nome di variabile/funzione molto più breve, rendendo così più semplice la chiamata di riferimento allo spazio di memoria allocato!

-1

Sembra che tu possa aver inavvertitamente confuso la minificazione con l'offuscamento.

Per comprendere le due tecnologie, le spiegherò separatamente.

Minification è un processo in cui le dimensioni di un file sorgente sono ridotte e trasformate in un formato destinato a una leggibilità più efficiente della macchina. Questo viene fatto (a) rimuovendo commenti e spazi bianchi non necessari, e possibilmente (b) sostituendo i nomi delle variabili con nomi di variabili semplici, incrementali che iniziano spesso con un carattere. Il codice risultante funziona ancora allo stesso modo del codice originale, ma teoricamente è più veloce per il browser analizzare e compilare.

L'offuscamento è una tecnica in cui il codice viene modificato in modo che non sia più riconoscibile come codice sorgente originale e venga spesso utilizzato per scoraggiare il reverse-engineering del codice proprietario. Alcune delle modifiche potrebbero avere un sovraccarico, ad esempio il codice potrebbe essere crittografato e quindi decrittografato di nuovo in fase di runtime. Detto questo, è tipico che un offuscatore di codice finisca il lavoro anche riducendo l'output.

Si potrebbe considerare la minificazione come una forma grezza di offuscamento, ma in genere tali processi vengono eseguiti più a fini di prestazioni e/o di larghezza di banda.

Problemi correlati