Newsgroup: it.comp.lang.javascript
Titolo: Differenza velocità di accesso ad un  elemento

Ciao a tutti.
Per verificarlo probabilmente basterebbe una prova con un bel po' di 
elementi, ma chiedo giusto per aprire un bel dibattito :-)
document.getElementById("pippo)
VS
document.forms[0](oppure il nome).pippo
la prima è più veloce, immagino... no?
ovviamente mi riferisco al caso in cui via script devo impostare un po' 
di cosette...
Daniele

 la prima è più veloce, immagino... no?
Mah...penso sia più veloce il riferimento ordinale che non quello via id o
name, ma oggigiorno penso che non vi siano differenze apprezzabili.
Dipende poi tutto dall'implementazione interna dei browser (magari una è
più veloce in IE perché il suo motore "predilige" una sintassi, ma con
mozilla magari è più veloce un'altra tecnica di riferimento a un
oggetto...)
Io ragionerei di standard e richiesta di compatibilità più che velocità in
questi casi.
-- 
"Affacciati affacciati benedici, guardaci
 guardaci...guardaci!
 Tanto sono quasi duemila anni che stai a guardare!"
									    E.B.

 
E lo standard cosa dice? Sono entrambe corrette mi sembra. Io utilizzo 
la prima solo per comodità (metti il caso che cambio l'id del tag FORM..

 la prima solo per comodità (metti il caso che cambio l'id del tag FORM..
In questo momento io uso quando posso le collection standard (forms,
images, links) perché funzionano con tutti i browser. Occorre però usare
l'ordinale perché il name è deprecato (non ti valida xhtml) sia per tag
form che per img.


 
Usare id anziché name?

 Usare id anziché name?
Se usi getElementById escludi già net4 e IE4, a questo punto è inutile IMHO
usare le collection standard (userei direttamente getElementById
sull'elemento).
Forse il solito mangiasassi-IE se metti un id alla form e usi
document.forms['idform'] la trova? Spero di no...


 
NOn ho capito bene, allora, cosa intendi per "ordinale". quando sento 
una parola con dentro "ord" pernso sempre ad un numero.. :-p

 una parola con dentro "ord" pernso sempre ad un numero.. :-p
document.forms[0]...ma lo trovo scomodo e comunque per links e images non è
molto pratico. Quindi uso document.forms['nome'] se voglio anche IE4,
altrimenti vado di getElementById.
-- 
"That until there is no longer first class
And second class citizens of any nation
Until the colour of a man's skin
Is of no more significance than the colour of his eyes
Me say war"
B.M.

questi casi.
<html>
<head>
<script type="text/javascript">
var out=null;
function test0(){
 if(out==null){
	out=document.getElementById("out");
 }
 var data=new Date(); 
 var value="";
 var startTime1=data.getTime();
 for(var i=0;i<20000;i++){
	value=document.forms[0].pippo.value;
 }
 data=new Date();
 var dTime1=data.getTime() - startTime1;
 data=new Date();
 value="";
 var startTime2=data.getTime();
 for(var i=0;i<20000;i++){
	value=document.getElementById("pippo").value;
 }
 data=new Date();
 var dTime2=data.getTime() - startTime2;
 var outs="tempo per forms[0].pippo = "+dTime1+"<br/>tempo per
getElementById = "+dTime2; 
 out.innerHTML=outs;
}
</script>
</head>
<body>
<form>
<input name="pippo" id="pippo" value="test" />
</form>
<a href="#" onclick="test0();return false">test</a>
<div id="out"></div>
</body>
</html>
Sul mio computer:
Mozilla 1.73
tempo per forms[0].pippo = 18290
tempo per getElementById = 16370
IE 6.0
tempo per forms[0].pippo = 2910
tempo per getElementById = 2750
FF 1.0 PR
tempo per forms[0].pippo = 16690
tempo per getElementById = 14830
Opera 7.23
tempo per forms[0].pippo = 1090
tempo per getElementById = 940
Netscape 7.1
tempo per forms[0].pippo = 22190
tempo per getElementById = 20100
Al momento non ho altri browser in grado di eseguire Javascript
intstallati sul PC.
Opera sembra il piu' veloce tra tutti, getElementById sembra piu'
veloce di forms[0]...
'bye

 veloce di forms[0]...
Sě, ma devi considerare che stai passando per 2 riferimenti
(document.forms[0] => pippo), mentre con getElementById č diretto...
Fai il confronto con un tag form (document.forms[0] contro
document.getElementById('idtuoform'), in teoria dovrebbero invertirsi i
risultati).
-- 
"Emancipate yourselves from mental slavery;
None but ourselves can free our minds"
									    B.M.

risultati).
Mozilla 1.73
tempo per forms[0] = 3630
tempo per getElementById = 2690
FF 1.0 PR
tempo per forms[0] = 3570
tempo per getElementById = 2530
Netscape 7.1
tempo per forms[0] = 2640
tempo per getElementById = 2310
IE 6.0
tempo per forms[0] = 1320
tempo per getElementById = 1870
Opera 7.23
tempo per forms[0] = 440
tempo per getElementById = 600
I browser Gecko insistono e Opera vince sempre sulla velocita' :-)
'bye

 I browser Gecko insistono e Opera vince sempre sulla velocita' :-)
Interessante la diversitŕ tra IE e mozilla...probabilmente perché mozilla č
nato su getElementById (magari la document.forms[0] internamente la ricava
sfruttando GetElementsByTagName, occorrerebbe buttare un occhio sul
sorgente)
-- 
"Ti sei salvato
 o sei entrato in banca pure tu?"
									    A.V.

>questi casi.
[cut]
E' un benchmark che lascia il tempo che trova, IMVHO. Il controllo andrebbe
fatto su una singola chiamata, all'interno di una pagina strutturalmente
pesante.. allora avrebbe senso.
Altrimenti possiamo benissimo dire che le differenze non sono apprezzabili,
e che appunto va ragionato in termini di compatibilita' e di scrittura di
un buon codice da manutenere.
Tra l'altro parecchio tempo fa feci dei test, e mi parve di vedere che la
getElementById "cachava" i risultati. Ovvero, la prima chiamata ad un dato
elemento era "piu' lenta" delle successive, come se nel primo caso cercasse
effettivamente l'elemento dato, mentre nel secondo restituisse un
riferimento.
Non ricordo su quali browser pero' feci questo test. Mi ricordo di averlo
fatto perche' quando ai tempi di NS4.x e IE4 sviluppavo librerie di
cross-browsing, avevo implementato una cache per NS4.x; e volevo vedere se
era il caso di fare una sorta di override della getElementById per proporre
un meccanismo simile.
-- 
C'ya,
  ZER0 :: coder.gfxer.webDesigner();
"When you have eliminated the impossible, whatever remains,
however improbable, must be the truth." (S.H.)