Sto provando a migliorare le prestazioni di uno script quando eseguito in un web worker. È progettato per analizzare file di testo di grandi dimensioni nel browser senza crash. Tutto funziona piuttosto bene, ma noto una grave differenza di prestazioni per file di grandi dimensioni quando si utilizza un web worker.Perché le prestazioni del web worker diminuiscono drasticamente dopo 30 secondi?
Quindi ho condotto un semplice esperimento. Ho eseguito lo script sullo stesso input due volte. La prima esecuzione ha eseguito lo script nel thread principale della pagina (nessun web worker). Naturalmente, questo fa sì che la pagina si blocchi e non risponda. Per la seconda esecuzione, ho eseguito lo script in un web worker.
Per piccoli file in questo esperimento (< ~ 100 MB), la differenza di prestazioni è trascurabile. Tuttavia, il file di grandi dimensioni, l'analisi richiede circa 20 volte più a lungo il thread di lavoro: si prevede
La linea blu. Deve solo prendere circa 11 secondi per analizzare il file, e le prestazioni sono abbastanza costante:
La linea rossa è la performance all'interno del lavoratore web. E 'molto più sorprendente:
La linea frastagliata per i primi 30 secondi è normale (la Jag è causata dal leggero ritardo nell'invio dei risultati al thread principale dopo ogni blocco del file viene analizzato). Tuttavia, l'analisi rallenta piuttosto bruscamente a 30 secondi. (Si noti che sto usando sempre e solo un singolo lavoratore web per il lavoro;. Mai più di un thread di lavoro alla volta)
Ho confermato che il ritardo è non a mandare i risultati alla principale thread con postMessage()
. Il rallentamento è in the tight loop del parser, che è completamente sincrono. Per ragioni che non riesco a spiegare, quel loop è drasticamente rallentato e diventa più lento con il tempo dopo 30 secondi.
Ma questo succede solo in un web worker. L'esecuzione dello stesso codice nel thread principale, come hai visto sopra, è molto semplice e veloce.
Perché sta succedendo? Cosa posso fare per migliorare le prestazioni? (Non mi aspetto che nessuno capisca a fondo tutte le oltre 1.200 linee di codice in quel file. Se lo fai, è fantastico, ma ho la sensazione che questo sia più correlato al web worker che al mio codice, dal momento che funziona bene nel main thread.)
Sistema: eseguo Chrome 35 su Mac OS 10.9.4 con 16 GB di memoria; Intel Core i7 quad-core da 2,7 GHz con cache L2 da 256 KB (per core) e L3 Cache da 6 MB. I blocchi di file hanno una dimensione di circa 10 MB.
Update: appena provato su Firefox 30 e ha fatto non esperienza lo stesso rallentamento in un thread di lavoro (ma era più lento di Chrome quando viene eseguito nel thread principale). Tuttavia, provare lo stesso esperimento con un file ancora più grande (circa 1 GB) ha prodotto un rallentamento significativo dopo circa 35-40 secondi (sembra).
Sto vedendo la stessa cosa con un semplice ciclo i = i + 1, stampando un messaggio ogni 1 milione di iterazioni. Il rallentamento inizia dopo circa 20 secondi in Chrome e 12 secondi in Firefox. Cos'è questo? –