Pagina 1 di 1

prestazioni javascript?

Inviato: lun 25 mar 2013, 21:35
da sya54M
Buona sera a tutti, stavo provando a fare una notifica di caricamento durante un calcolo pesante in javascript, cioè a far comparire un <div> quando inizia a calcolare e scomparire alla fine del calcolo.
Una cosa del genere:

Codice: Seleziona tutto

document.getElementById("caricamento").style.display = "block";
do {
...
}
while(...);
document.getElementById("caricamento").style.display = "none";
Ma l'unico browser che sembra comportarsi bene è opera (ed è anche il più veloce ad eseguire il calcolo).
Chrome si ferma subito dicendo che uno script sta rallentando la pagina, firefox aspetta qualche secondo e dice la stessa cosa ma dopo un po' porta a buon fine il calcolo, però il <div> non compare mai, sembra che durante il calcolo il browser sia congelato e si scongela a fine calcolo.
Se non sono riuscito a far capire la situazione chiedete pure.
Come mai sia chrome che firefox sembrano così fragili? è colpa del mio codice?

Re: prestazioni javascript?

Inviato: lun 25 mar 2013, 23:14
da teox99
La velocità di js si nota soprattutto nella gestione del dom e non nei calcoli matematici complessi o cicli impegnativi, che dovrebbero essere esegiti lato server.
Ci sono vari benchmark da provare lato client se cerchi.
Questo è interessante
http://jsperf.com/for-or-while

Re: prestazioni javascript?

Inviato: mar 26 mar 2013, 9:00
da sya54M
Sì ma volevo fare un'applicazione statica che girasse offline nel browser.
La cosa strana è che document.getElementById("caricamento").style.display = "block"; è prima del while, ma il browser si freezza prima che il div venga renderizzato.
Separando la funzione con un setTimeout di mezzo secondo funziona:

Codice: Seleziona tutto

function funzione() {
  document.getElementById("caricamento").style.display = "block";
  setTimeout("continua();", 500);
}
function continua() {
do {
...
}
while(...);
document.getElementById("caricamento").style.display = "none";
Non fa in tempo a renderizzare il div che già entra nel while se non faccio in questo modo.

Re: prestazioni javascript?

Inviato: mar 26 mar 2013, 9:38
da lennynero
...usa un worker;)

Re: prestazioni javascript?

Inviato: mar 26 mar 2013, 9:46
da sya54M
ieri sera ho trovato qualcosa su internet riguardo questo worker, ma non ci ho capito molto :oops:

Re: prestazioni javascript?

Inviato: mar 26 mar 2013, 10:06
da sya54M
ok mi sono informato meglio leggendo una spiegazione in italiano, in inglese mi viene difficile.
ma mi viene complesso inviare molti dati alla ui usando il postMessage.
non si potrebbe creare una semplice funzione sleep che però metta a riposo la cpu, quindi senza cicli di calcoli?

Re: prestazioni javascript?

Inviato: gio 3 ott 2013, 18:49
da kentaromiura
So che questo thread é un po vecchio ma volevo spiegare il perché succede questo.

EcmaScript nel browser é single-threaded, per cui, nel tuo do/while tu stai bloccando il thread, impedendo il render a video, probabilmente Opera lo mostra per il semplice motivo che il repaint del div viene triggerato in maniera diversa, non tutti i browser triggano i repaint allo stesso modo.

Non é possibile usare un sleep, e' possibile scrivere il codice 'ad eventi' in maniera tale da riprendere l' esecuzione una volta finito il calcolo.

La soluzione piu' semplice e' usare un setTimeout(callback, 0) o un requestAnimationFrame/setImmediate nei browser nuovi per poi, alla fine del calcolo, andare a nascondere nuovamente il div, in pratica devi riscrivere il tuo codice in maniera da utilizzare delle callback, come hai fatto nel tuo esempio dove hai usato 500ms di setTimeout.


* setImmediate: https://github.com/NobleJS/setImmediate
* request Animation Frame: http://www.paulirish.com/2011/requestan ... animating/

Re: prestazioni javascript?

Inviato: ven 4 ott 2013, 8:28
da sya54M
Ti ringrazio dell'intervento, ma infatti avevo già fatto con setTimeout, però per non spezzare le funzioni l'ho messo direttamente nelle chiamate alle funzioni nelle pagine html

Codice: Seleziona tutto

onclick="caricamento();setTimeout(function(){funzione(var1,var2,var3,var4,var5,var6);},500);"

Re: prestazioni javascript?

Inviato: ven 4 ott 2013, 9:07
da paolo1957
Forse puoi provare con una soluzione un pò diversa: http://jqueryui.com/progressbar/#indeterminate

Re: prestazioni javascript?

Inviato: ven 4 ott 2013, 9:26
da sya54M
molto carino però jquery mi appesantirebbe molto le applicazioni, si tratta infatti di app per android e dovrebbero essere fluide anche su terminali lenti e non togliere risorse utili ai calcoli iterativi che compiono