prestazioni javascript?

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

prestazioni javascript?

Messaggio 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?

Avatar utente
teox99
Linux 3.x
Linux 3.x
Messaggi: 738
Iscritto il: ven 25 lug 2008, 14:54
Slackware: 13.37
Desktop: KDE - Xfce
Località: Roma[Eur]
Contatta:

Re: prestazioni javascript?

Messaggio 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

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: prestazioni javascript?

Messaggio 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.

Avatar utente
lennynero
Linux 3.x
Linux 3.x
Messaggi: 641
Iscritto il: lun 3 mag 2004, 0:00
Nome Cognome: Luigi Picaro
Slackware: 15.0-x64
Kernel: 6.1
Desktop: Xfce-4.16
Località: Salerno

Re: prestazioni javascript?

Messaggio da lennynero »

...usa un worker;)

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: prestazioni javascript?

Messaggio da sya54M »

ieri sera ho trovato qualcosa su internet riguardo questo worker, ma non ci ho capito molto :oops:

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: prestazioni javascript?

Messaggio 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?

kentaromiura
Linux 0.x
Linux 0.x
Messaggi: 3
Iscritto il: gio 3 ott 2013, 18:28
Slackware: 14.1 ARM

Re: prestazioni javascript?

Messaggio 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/

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: prestazioni javascript?

Messaggio 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);"

paolo1957
Linux 0.x
Linux 0.x
Messaggi: 14
Iscritto il: mar 27 ago 2013, 16:50
Nome Cognome: Paolo Seria
Slackware: slackware64-current
Kernel: 3.10.9
Desktop: kde
Località: Roma

Re: prestazioni javascript?

Messaggio da paolo1957 »

Forse puoi provare con una soluzione un pò diversa: http://jqueryui.com/progressbar/#indeterminate
nessuna

Avatar utente
sya54M
Master
Master
Messaggi: 1665
Iscritto il: mer 6 giu 2007, 14:44
Nome Cognome: Andrea Peluso
Slackware: 64-current
Kernel: ultimo
Desktop: KDE
Località: (Salerno)
Contatta:

Re: prestazioni javascript?

Messaggio 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

Rispondi