5

Sono di fronte a un comportamento molto strano con la mia applicazione - se avvio il profiler (deve essere JS profiler), il codice funziona quasi il doppio più velocemente.Il codice JavaScript funziona più velocemente quando JS Profiling è attivo? Che cosa?

ho riprodotto con un codice molto semplice che può essere trovato su questo violino: https://jsfiddle.net/zagrwk44/

La cosa è che questo riproduce solo su macchine con vecchie schede grafiche. Sono riuscito a riprodurlo su una macchina con la scheda grafica AMD Radeon HD 6450. Su una macchina nuova questo non si riproduce più.

Come mai il profiler rende il codice più veloce? quasi due volte più veloce!

Il codice che prende il tempo qui è solo cambiando la posizione di un div sullo schermo:

for (var i = 0; i < 1000000; i++) { 
    box.style.top = getRandomInt(0, 100) + '%'; 
    box.style.left = getRandomInt(0, 100) + '%';     
}; 

sto avviare e arrestare il profiler tramite javascript con console.profile e console.profileEnd. Per poterlo riprodurre, DevTools deve essere aperto durante l'esecuzione.

Grazie!

risposta

0

Ho trovato questo strano comportamento che mi capita solo sul sistema operativo "Windows server 2008 R2 enterprise".

il tester non è corretta indicazione in quanto testare le prestazioni con una funzione random che potrebbe portare a un diverso risultato per ogni campione, più che non si esclude l'console.profile() e console.profileEnd() dal momento del campionamento, il che significa che non hai mai ottenuto risultati reali nativi.

per ottenere un risultato migliore e realistica il codice dovrebbe essere simile a questo:

var random = [80,90,15,5,70,50,60,25,36,45,62,58,76,23,93]; 

fbtn.addEventListener('click', function() { 

    //START PROFILE BEFOR TIME START 
    if (withProfiling.checked) { 
     console.profile(); 
    } 

    console.time('click handler'); 
    for (var i = 0, v =0; i < 1000000; i++, v++) { 
     box.style.top = random[v] + '%'; //USE SAME NUMBERS FOR ALL TESTS 
     box.style.left = random[v] + '%';//USE SAME NUMBERS FOR ALL TESTS 

     if(v >= 14){ 
     v= 0; 
     }   
    }; 
    console.timeEnd('click handler'); 

    // STOP PROFILE AFTER TIME END 
    if (withProfiling.checked) { 
      console.profileEnd(); 
     } 
    }); 

ecco un tester che potrebbe tracciare in modo più approfondito: http://embed.plnkr.co/bdreL4UVFyyWtDoNTXRs/

rimuovo il profiler a partire dal codice , perché ho trovato questo strano comportamento ripristinare meglio avviando i profili manualmente.

per ripristinarlo selezionare "Raccogli profilo CPU Javascript" dai profili di DevTools su Chrome.

Spero sia stato utile,

Menachem

2

Can not repro sulla mia macchina.
Ma sono curioso, paragoni una corsa con DevTools open vs una corsa con profiler? In tal caso, la spiegazione potrebbe essere che DevTools disabilita le notifiche interne, come gli aggiornamenti al pannello Elementi quando il profilo è attivo.
Se stai confrontando una corsa con DevTools chiuso, sembra davvero strano.