ugrás a tartalomhoz

9 JavaScript Tips You May Not Know

Török Gábor · 2006. Okt. 9. (H), 15.04
Néhány tipp a hatékonyabb fejlesztéshez JavaScriptben
 
1

Hogy célszerűbb sok szöveget egybefűzni?

Török Gábor · 2006. Okt. 12. (Cs), 11.21
A blogmarkban hivatkozott cikkben, ill. számos egyéb írásban (Javascript string concatenation, String Concatenation Tests, JavaScript Strings Concatenation) is azt javasolják teljesítménybeni megfontolásból, hogy sztring összefűzéshez a konkatenáló operátor helyett inkább a tömbös megoldást használjuk, mert sokszor gyorsabb.

Csak nálam nem?

str = "";
console.time("stringconcat");
for (i = 0; i < 10000; i++) { str += "" + i; }
console.timeEnd("stringconcat");

arr = [];
console.time("arrayconcat");
for (i = 0; i < 10000; i++) { arr.push("" + i); }
arr.join("");
console.timeEnd("arrayconcat");

arr2 = [];
console.time("arrayconcat2");
for (i = 0; i < 10000; i++) { arr2[arr2.length] = "" + i; }
arr2.join("");
console.timeEnd("arrayconcat2");
Eredmény:

stringconcat: 65ms
arrayconcat: 159ms
arrayconcat2: 108ms

Teszteltem több verziójú Firefox és Opera alatt, mindenhol jelentősen gyorsabb a mezei szöveg összefűzés. Van valakinek ezzel kapcsolatban tapasztalata, tanácsa?
2

nem feltöltött tömbről beszélünk?

zsepi · 2006. Okt. 12. (Cs), 13.29
lehet, hogy én értelmeztem rosszul ezt a korábbiakban, de nekem mindig az volt a benyomásom, hogy arról az esetről beszélnek, amikor már megvan a kész tömb, amit össze szeretnénk fűzni. Azaz
arr = [];
for(i = 0; i < 10000; i++) {
  arr.push("" + i);
}
str = "";
console.time("stringconcat");
for (i = 0; i < arr.length; i++) { str += arr[i]; }
console.timeEnd("stringconcat");

str = "";
console.time("arrconcat");
str = arr.join("");
console.timeEnd("stringconcat");
itt most nincs konzolom, de így biztos, hogy gyorsabb (folyt. köv., csak most meeting)
4

Mi a különbség?

Török Gábor · 2006. Okt. 12. (Cs), 14.49
Ha már van egy tömbön, értelemszerűen a join()-t fogom használni, de azt a tömböt is egyszer fel kell tölteni, illetőleg a cikkben is az én példámmal gyakorlatilag egyező kódot mutatnak; két ciklus, nulláról kezdek, egyikben push()-sal töltök, másikban konkatenálok. Lehetséges, hogy itt valóban annyi a megjegyeznivaló, hogy már feltöltött tömb elemeit érdemes join()-nal összefűzni, de akkor nem látom, mi a másik út?

stringconcat: 75ms
arrconcat: 6ms
5

re: ha már van tömböm

zsepi · 2006. Okt. 12. (Cs), 18.05
Ha már van egy tömbön, értelemszerűen a join()-t fogom használni

Te lehet, hogy igen, de nem vagy kellőképp reprezentatív minta :) Te sem lepődnél meg, ha valahol feltöltött tömbön is strconcat-et találnál :) De vissza a tárgyhoz: tegyük fel, te értelmezed jól (s a linkjeid alapján úgy tűnik, én voltam naív). A bookmarkolt oldal azt mondja, hogy:
This method will result in too many intermediate strings and concatenation operations, and will poorly perform overall.

Azaz az első megoldásban az lassít, hogy minden ciklusban kiolvassa az str értékét, hozzáfűzi az új értéket, majd letárolja az eredményt memóriaban, végül ezt átmásolja az str-be (vagy csak mutatót billent?), azaz így ciklusonként két vagy három új sztring jön létre, s ezen sztringek létrehozása (memória lefoglalása) okozza a gondot.
Ugyanakkor megjegyzi, hogy a tömbös megoldás
This method doesn't suffer from the extra string objects, and generally executes faster.
, mert ciklusonként csak egy sztring jön létre, amit a tömb változóban tárol el. Itt szvsz az lassít, hogy a tömböt folyton át kell méretezni. Ha fix méretű tömböt hozol létre, akkor is lassabb? S ha hosszabb sztringeket gyártasz, akkor mi az eredmény? Más böngészőkön mi az eredmény? Ezt még megnézzük...
6

Nincs kész a tömb

Bártházi András · 2006. Okt. 12. (Cs), 18.34
Arról az esetről beszélnek, amikor sztringeket kell összefűzni, és még nincs kész a tömb.
7

JavaScipt értelmező

Bártházi András · 2006. Okt. 12. (Cs), 18.36
Erősen függ a dolog attól, hogy mely JavaScript értelmező van a háttérben. A Firefox-é és az Operáé übermodern, ezeket ezekszerint megoldották benne. Próbáld ki Explorerrel is. Egyébként úgy tudom, hogy ez más nyelveknél is probléma tud lenni, nem JS specifikus.
8

Plusz

Bártházi András · 2006. Okt. 12. (Cs), 18.38
Van még egy aspektus:
str = "Hello"+" "+"World"+"!";
str = ["Hello","+","World","!"].join();
9

Sok hűhó

Török Gábor · 2006. Okt. 13. (P), 10.03
Köszönöm, akkor csak én kerítettem túl nagy feneket a dolognak.
10

Kisebb hibalehetőség

Jano · 2006. Okt. 13. (P), 10.34
Az array.push() megoldásnak van még egy előnye: kisebb a hibalehetőség. A string összefűzésnél gyakran előfordul, hogy "+=" helyett véletlenül sima "="-t írok.
3

assertion rész

Anonymous · 2006. Okt. 12. (Cs), 14.46
Sziasztok!
Ez az assertionos rész hogy működik?
A try...catch(e) -ben az e az err objektum, hogy lesz instanceof AssertException?
Köszi...
KR