2012-11-13 6 views
9

Ho un caso d'uso in cui ho bisogno di ottenere il numero totale di linee Javascript eseguite quando la mia pagina web si sta caricando.Numero di righe Javascript eseguite durante il caricamento della pagina

Il problema che sto affrontando è che il browser genera un avviso quando un certo numero di esecuzioni JS supera (5 milioni penso in caso di IE) e la pagina viene impiccata.

Ho usato il profiler disponibile nella barra degli strumenti di IE Developers, ma mi dà il numero totale di funzioni JS chiamate ma non il numero totale/numero di linee eseguite.

Qualsiasi aiuto è apprezzato.

Grazie

+4

dubito fortemente che questo si basa su linee di codice. Molto probabilmente si innesca quando il motore JS impiega troppo tempo senza passare il controllo al browser. – ThiefMaster

+0

'while (true);' causerà anche il blocco della pagina ... riceverai quello che sto dicendo? – Matt

+5

@ThiefMaster: avrei pensato la stessa cosa, ma interessante, sembra che l'OP sia effettivamente corretto: http://blogs.msdn.com/b/jpsanders/archive/2008/09/23/a-script-on -questa-pagina-sta-causando-internet-explorer-per-eseguire-lentamente-if-it-continua-to-run-your-computer-may-become-unresponsive.aspx – mellamokb

risposta

0

in bash:

wc -l file.js 

In PHP:

<?php 
$c=0; 
$file_handle = fopen("file.js", "r"); 
while (!feof($file_handle)) { 
    $line = fgets($file_handle); 
    $c++; 
} 
fclose($file_handle); 
print "$c lines.\n"; 
?> 

In Node.js:

var i, count = 0, js=require('fs').createReadStream('file.js'); 

js.on('data', function(chunk) { 
    for (i=0; i < chunk.length; ++i) 
     if (chunk[i] == 10) count++; 
}); 

js.on('end', function() { 
    console.log(count); 
}); 

Prova minification per ottenere i line-numeri verso il basso .

Questo sembra un sacco di codice.

+0

Questo non lo farà. IE sta contando le istruzioni eseguite (non le righe di codice), quindi le istruzioni all'interno dei loop vengono contate su ogni iterazione, ecc. Questo è indicato nel [post del blog MSDN] (http://blogs.msdn.com/b/jpsanders/ archive/2008/09/23/un-script-on-this-page-è-causando-internet-explorer-to-run-lentamente-se-si-continua-to-run-your-computer may-become- unresponsive.aspx) mellamokb ha fornito nel suo commento sulla domanda. – Bryan

+1

Yeh, stavo rispondendo alla loro domanda originale, ma la risposta corretta è "riscrivi il tuo codice, è troppo codice." – konsumer

1

Questo può aiutare:

http://www-archive.mozilla.org/performance/jsprofiler.html

La prima riga specifica il file js da cui sono stati raccolti i tempi. Ogni linea di sotto cioè del formato: [A, B] C {DE} F {G, H, I}

D -> numero di linea di base della funzione nel file JS
E - > Numero di riga (ultimo) di estensione della funzione nel file JS

1

Prima di tutto, è necessario ridisegnare il proprio codice; 5 milioni di dichiarazioni senza restituire il controllo al browser sono in ogni caso un sacco di codice, immagina come i browser mobili faranno fatica ad affrontarlo.

Un modo per scoprire quante istruzioni vengono eseguite consiste nello strumentare il codice, aggiungendo un'istruzione per ogni istruzione nel codice per contare il numero di volte in cui è stata eseguita, raddoppiando effettivamente il numero di istruzioni nel codice.

Esistono anche strumenti di copertura del codice che possono essere eseguiti all'interno del browser senza dover necessariamente strumentare il codice; Googling per "copertura del codice javascript" fornisce una buona quantità di estensioni del browser che è possibile utilizzare, ad esempio hrtimer.

1

Basta dividerlo in blocchi più piccoli e chiamare dopo un timeout - che aggira il problema di IE. per esempio.

somethingBig(); 
somethingElseBig(); 

invece scrivere:

somethingBig(); 
setTimeout(somethingElseBig);