Gzip contro minify


131

L'altro giorno ho avuto una discussione piuttosto vivace sulla minimizzazione di Javascript e CSS rispetto a qualcuno che preferisce usare Gzip.

Chiamerò questa persona X.

X ha detto che Gzip minimizza già il codice, poiché comprime i file.

Non sono d'accordo. Zip è un metodo senza perdita di riduzione delle dimensioni dei file. Lossless significa che l'originale deve essere ripristinato perfettamente, il che significa che le informazioni devono essere archiviate per poter ripristinare gli spazi, i caratteri non necessari, il codice commentato e tutto il resto. Ciò occupa più spazio, poiché è necessario comprimerne di più.

Non ho un metodo di test, ma credo che il Gzip di questo codice:

.a1 {
    background-color:#FFFFFF;
    padding: 40px 40px 40px 40px;
}

Sarà ancora più grande del Gzip di questo codice:

.a1{body:background-color:#FFF;padding:40px}

C'è qualcuno che può dimostrare questo giusto o sbagliato.
E per favore non venire dicendo "È giusto perché è quello che ho sempre usato".

Sto chiedendo prove scientifiche qui.


48
Cerca di non prestare attenzione ai risultati di compressione quando guardi file estremamente piccoli. Renditi conto che deflate e gzip comportano un sovraccarico, quindi l'effetto dell'overhead è molto maggiore quando le dimensioni del file sono ridotte.
Minimo

8
Un punto valido Tuttavia, non ti annoierei con centinaia di righe di CSS / JS, quando il codice mostrato sopra mostra in modo appropriato il principio di ciò che volevo ricercare.
KdgDev,

@JamesMcMahon Un punto valido, ma non una risposta.
Abby Chau Yu Hoi,

Una cosa che dovrebbe essere degna di nota è il limite di cache (varia a seconda del browser), ma alcuni browser per dispositivi mobili memorizzano nella cache in base alla dimensione del file decompresso e in quei casi la minimizzazione è il tuo amico. Inoltre ho un'app Web JavaScript da 2meg (commenti e reazioni, JS e tutto il resto) che quando minimizzata (uguagliata) e compressa (usando la compressione zopfli) è 75k (la minificazione da sola è all'incirca 200k).
vipero07,

Risposte:


192

Molto semplice da testare. Ho preso i tuoi js, li ho messi in file diversi e ho eseguito gzip -9 su di essi. Ecco il risultato. Ciò è stato fatto su una macchina WinXP con Cygwin e gzip 1.3.12.

-rwx------  1 xxxxxxxx mkgroup-l-d     88 Apr 30 09:17 expanded.js.gz

-rwx------  1 xxxxxxxx mkgroup-l-d     81 Apr 30 09:18 minified.js.gz

Ecco un ulteriore test usando un esempio JS del mondo reale. Il file di origine è "common.js" La dimensione del file originale è 73134 byte. Minimizzato, arrivò a 26232 byte.

File originale:

-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 73134 Apr 13 11:41 common.js

File minimizzato:

-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d 26232 Apr 30 10:39 common-min.js

File originale compresso con l'opzione -9 (stessa versione di cui sopra):

-rwxrwxrwx 1 xxxxxxxx mkgroup-l-d 12402 Apr 13 11:41 common.js.gz

File minimizzato con gzip con l'opzione -9 (stessa versione di cui sopra):

-rwxr-xr-x 1 xxxxxxxx mkgroup-l-d  5608 Apr 30 10:39 common-min.js.gz

Come puoi vedere, c'è una netta differenza tra i vari metodi. La scommessa migliore è minimizzare e decomprimere.


9
Robert, questa è l'ultima opzione
Chuck Vose,

4
Da 71k a 26k non sono tipici risultati di minificazione! Nei miei test, era più simile al 20-25%. Anche questo sembra essere ciò che Yahoo ha ottenuto: developer.yahoo.com/performance/rules.html .
Deepak,

1
Il ridimensionamento della minimizzazione dipende da molti fattori .... uno di questi è la quantità di codice che viene commentata. Più commenti, più risparmi. Comunque ... la minificazione è importante oggi soprattutto a causa degli utenti mobili.
Alex Benfica,

28

Ecco i risultati di un test che ho fatto qualche tempo fa, usando un file CSS "vita reale" dal mio sito web. L'ottimizzatore CSS viene utilizzato per la minificazione. L'app di archiviazione Linux standard fornita con Ubuntu è stata utilizzata per Gzipping.

Originale: 28.781 byte
Minimizzato: 22.242 byte
Compresso con zip: 6.969 byte
Min + Gzip: 5.990 byte

La mia opinione personale è quella di scegliere prima Gzipping, dal momento che ovviamente fa la differenza. Per quanto riguarda la minificazione, dipende da come lavori. Dovresti conservare il file CSS originale per effettuare ulteriori modifiche lungo la linea. Se non ti dà fastidio minimizzarlo dopo ogni modifica, prova.

(Nota: esistono altre soluzioni, come eseguirlo attraverso un minificatore "su richiesta" durante la pubblicazione del file e memorizzarlo nella cache nel filesystem.)


Ottieni un risparmio extra del 14%. Ciò concorda anche con i risultati di Steve Souders. Nel suo libro "Siti Web ad alte prestazioni", ha una sezione su gzip vs minificazione. (Cap10, p74) Passa da 85K (originale), 68K (solo JSMin), 23K (solo gzip), a 19K (JSMin + gzip). Questo è circa il 20% risparmiato grazie alla minificazione.
Deepak,

1
In questi giorni ci sono anche mappe di origine che ti consentono di provare a ottenere il meglio da entrambi i mondi se scegli di minimizzare.
jeteon,

16

Fai attenzione quando provi questo: quei due frammenti di CSS sono banalmente piccoli, quindi non beneficiano della compressione GZIP - l'aggiunta della piccola intestazione e piè di pagina di GZIP (circa 20 byte in testa) da sola perderà i guadagni ottenuti. In realtà non avresti un file CSS così piccolo ed essere preoccupato di comprimerlo.

minify + gzip comprime più di un semplice gzip

La risposta alla domanda originale è, sì, minify + gzip otterrà una quantità significativamente maggiore di compressione rispetto a gzip. Questo vale per qualsiasi esempio non banale (ovvero qualsiasi codice JS o CSS utile che superi le centinaia di byte).

Per esempi di questo in effetti, prendi il codice sorgente di Jquery che è disponibile minimizzato e non compresso, comprimili entrambi con gzip e dai un'occhiata.

Vale la pena notare che Javascript beneficia molto di più dalla minificazione rispetto ai CSS ben ottimizzati, ma c'è ancora un vantaggio.

Ragionamento:

La compressione GZIP è senza perdita di dati. Ciò significa che deve memorizzare tutto il testo, inclusi spazi bianchi esatti, commenti, nomi di variabili lunghe e così via, in modo che possano essere perfettamente riprodotti in seguito. D'altra parte, la minificazione è in perdita. Se minimizzi il tuo codice, stai rimuovendo gran parte di queste informazioni dal tuo codice, lasciando meno che GZIP debba preservare.

  • La minimizzazione scarta inutilmente gli spazi bianchi, lasciando spazi solo dove necessario per motivi sintattici.
  • La minimizzazione rimuove i commenti.
  • La minimizzazione del codice può sostituire i nomi degli identificativi con nomi più brevi in ​​cui non vi sarebbero effetti collaterali.
  • La minimizzazione del codice può rendere banali "ottimizzazioni del compilatore" per il codice che sono possibili solo analizzando effettivamente il codice
  • La minimizzazione CSS può eliminare regole ridondanti o combinare regole che hanno lo stesso selettore.

11

Hai ragione.

Non è lo stesso minimizzare che gzip (sarebbero chiamati uguali se fosse così). Ad esempio, non è lo stesso per decomprimerlo:

var myIncrediblyLongNameForThisVariableThatDoesNothingButTakeUpSpace = null;

Di minimizzare per finire con qualcosa del tipo:

var a = null;

Certo, direi che l'approccio migliore nella maggior parte dei casi è quello di minimizzare PRIMA quindi Gzip, piuttosto che minimizzare o gzip, anche se a seconda del codice a volte solo minimizzare o gzip ti darà risultati migliori rispetto a entrambi.


6

C'è una soglia alla quale la codifica gzip è vantaggiosa. La regola generale è: più grande è il file, migliore sarà la compressione e gzip che vinceranno a mani basse. Ovviamente puoi minimizzare prima poi gzip dopo.

Ma se stiamo parlando di gzip vs. minify su un piccolo pezzo di testo lungo non più di 100 byte, un confronto "oggettivo" è inaffidabile, persino inutile - a meno che non veniamo fuori con un testo di base per stabilire un metodo standard di benchmarking, come un tipo Lorem Ipsum ma scritto in Javascript o CSS.

Vorrei quindi proporre di confrontare le ultime versioni di jQuery e MooTools (le versioni non compresse) usando il mio codice Fat-Free Minify (PHP) (semplicemente eliminando spazi bianchi e commenti, nessun accorciamento di variabili, nessuna codifica baseX)

Ecco i risultati di minify vs. gzip (con compressione conservativa di livello 5) vs. minify + gzip:

MooTools-Core
-------------
Baseline 102,991 bytes
Minified 79,414 (77.1% of original)
Gzipped 27,406 (26.6%)
Minified+Gzipped 22,446 (21.8%)

jQuery
------
Baseline 170,095
Minified 99,735 (58.6% of original)
Gzipped 46,501 (27.3%)
Minified+Gzipped 27,938 (16.4%)

Prima che qualcuno salti la pistola, questa non è una battaglia delle librerie JS.

Come puoi vedere, minimizzare + gzipping ti dà una migliore compressione su file di grandi dimensioni . La minimizzazione del codice ha i suoi vantaggi, ma il fattore principale è la quantità di spazi bianchi e commenti presenti nel codice originale. In questo caso, jQuery ne ha di più, quindi offre una migliore minimizzazione (molti più spazi bianchi nella documentazione in linea). La forza della compressione di Gzip sta nella quanta ripetizione del contenuto. Quindi non si tratta di minify vs. gzip. Fanno le cose diversamente. E ottieni il meglio da entrambi i mondi usando entrambi.


5

Perché non usare entrambi?


1
A volte minimizzare e poi gzipare ottiene un risultato peggiore rispetto a fare solo uno di essi. Infatti, come testato da madewulf, decomprimere il semplice file di esempio CSS darà un file più grande dell'originale!
Seb

4
Di solito dipende dalle dimensioni del file. Tutti i tuoi file CSS e JS in produzione trarranno vantaggio dalla minimizzazione e dalla compressione. Se hai un sacco di file che sono <1KB, combinali tutti insieme quindi minimizza e gzip ...
Min

1

È facile da testare: basta inserire il testo dei tuoi CSS in file di testo e comprimere i file usando un archiviatore come gzip su Linux.

Ho appena fatto questo, e succede che per il primo css, la dimensione è di 184 byte e per il secondo 162 byte.

Quindi, hai ragione, lo spazio bianco è importante anche per i file compressi con gzip, ma come si può vedere da questo piccolo test, per file veramente piccoli, la dimensione del file compresso potrebbe essere maggiore della dimensione del file originale.

Ciò è dovuto solo alle dimensioni molto ridotte del tuo esempio, per file più grandi, gzipping ti farà ottenere file più piccoli.


In tal caso ... Preferirei avere i semplici file CSS! Caspita, 184 byte per quella poca informazione ...
Seb

Puoi usare gzip <infile> outfile su Linux (o meglio, gzip <infile | wc). tar memorizza molti metadati.
phihag,

1
7-zip NON è lo stesso algoritmo di gzip.
vartec,

1

Non ho visto nessuno menzionare Mangling, quindi sto pubblicando i miei risultati su questo.

Ecco alcune cifre che ho ideato usando UflifyJS per la minificazione e Gzip. Avevo circa 20 file che ho concatenato insieme a circa 2,5 MB con commenti e tutto il resto.

File Concat 2,5 MB

uglify({
    mangle: false
})

Minimizzato senza demolizione: 929kb

uglify({
    mangle: true
})

Minificato e rovinato: 617kb

Ora se prendo quei file e li gzip otterrò rispettivamente 239kb e 190kb.


0

Esiste un metodo molto semplice per testare questo: creare un file composto solo da spazi bianchi e un altro file che è veramente vuoto. Quindi Gzip entrambi e confronta le loro dimensioni. Il file con lo spazio bianco sarà ovviamente più grande.


0

Ovviamente una compressione "umana" con perdita di dati che preserva il layout o altre cose importanti e rimuove tutte le spazzature non necessarie (spazi bianchi, commenti, elementi ridondanti ecc.) Sarà migliore di una compressione gZip senza perdita di dati.

Ad esempio, cose come segni o nomi di funzioni avranno probabilmente una certa lunghezza per descriverne il significato. Sostituire questo con nomi lunghi un carattere farà risparmiare molto spazio e non è possibile con la compressione senza perdita.

A proposito, per CSS ci sono strumenti come il compressore CSS che farà il lavoro in perdita per te.

Tuttavia, otterrai i migliori risultati combinando "ottimizzazione con perdita" e compressione senza perdita.


0

ovviamente puoi provare - scrivi il tuo in un file e decomprimilo con zlib . Puoi anche provare con il programma di utilità "gzip".

tornando alla tua domanda: non esiste una relazione definita tra la lunghezza della sorgente e il risultato compresso. il punto chiave è l'entropia (quanto diversi sono gli elementi nella fonte).

quindi, dipende da come è la tua fonte. ad esempio, molti spazi continui (es.> 1000) possono essere compressi delle stesse dimensioni di pochi (es. <10) spazi.


0

questo è il risultato quando gziping i due file

bytes  File
45     min.txt
73     min.gz

72     normal.txt
81     normal.gz

2
@madewulf, questo è solo il caso in cui i file sono così piccoli e banali che l'aggiunta dell'intestazione del file GZIP in realtà fa più differenza del risparmio di spazio. Nessuno userebbe un file CSS così piccolo in pratica, o se lo facesse, comprimerlo non dovrebbe essere la loro prima preoccupazione. Ad ogni modo, mostra ancora che minimizzare + gzipping è più efficiente del semplice gzipping, il che ovviamente è vero.
thomasrutter,

-1

Hai ragione, minimizza + i risultati gzip in meno byte. Nessuna prova scientifica però.

Come mai non hai un metodo di prova?

Minimizza il tuo codice in un file e lascialo "non modificato" su un altro. Carica su un server web in grado di decomprimere l'output (ad esempio mod_deflate per Apache), installa l'estensione Firebug per firefox, svuota la cache e accedi a entrambi i file. La scheda "NET" di Firebug conterrà la quantità esatta di dati trasferiti, confrontandoli e avrai una prova "empirica".

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.