Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 21
  1. #11
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    :master: mi interessa molto la prima parte... e ne aprofitto subito.

    supponi di avere un vettore lungo (diciamo 10.000).
    Da questo vettore mi debbo ricavare mediante iterazione una stringa del tipo:


    "<select value="valore1">....</select>..............."

    se fossi in c# e usassi la concatenazione di stringa

    s += vettore[i];

    la procedura sarebbe lentissima a causa della creazione dell'oggetto stringa ad ogni iterazione.

    In javascript, c'è questo problema?

    risolverei con concat ?

    Pietro

  2. #12
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    ok: suggerimento acquisito: pagina di esempio salvata in libreria esempi per usi futuri
    Pietro

  3. #13
    Originariamente inviato da pietro09
    se fossi in c# e usassi la concatenazione di stringa

    s += vettore[i];

    la procedura sarebbe lentissima a causa della creazione dell'oggetto stringa ad ogni iterazione.

    In javascript, c'è questo problema?
    ovvio .. in qualunque linguaggio c'è questo problema ... non conosco linguaggi dove le stringhe non siano variabili immutabili (a livello di core)

    non a caso si sfruttano sempre array per migliorare le performances durantele operazioni come questa.

    In C# si usa la StringBuilder se non erro, con il suo metodo Append, sempre se non erro ... in JavaScript dipende cosa devi fare, nel senso che se è un'assegnazione attraverso un loop farai qualcosa tipo ....
    codice:
    var	stringa = [];
    while(qualcosa)
    	stringa.push(qualche stringa);
    
    elemento.innerHTML = stringa.join("");

    ma se devi appendere o creare stringhe avendo già a disposizione più variabili ... fare questo:
    codice:
    while(qualcosa)
    	var	tmp = "ci" + "ao" + "a" + "tutti" + tranne() + "a" + 1;
    fai molto prima a scrivere
    codice:
    while(qualcosa)
    	var	tmp = "ci".concat("ao", "a", "tutti", tranne(), "a", 1);
    che ad usare anche fosse l'array ... concat è più veloce di un array dinamico con join poichè concat lavora in core ... tipo la StringBuilder di C#.

    Concludo dicendo che con concat il codice è anche più pulito e le operazioni aritmetiche dei vari elementi vengono delimitate da una virgola, quindi non ci si sbaglia e non si devono aggiungere parentesi, come era invece nel tuo caso

    1 + 2 + 3 + "px" .... abbastanza ambiguo ... ,meglio
    (1 + 1+ 2) + "px" se stringa deve essere.


    Concludo che usando concat(parametri) i parametri non hanno bisogno del toString, richiamato in automatico


    cosa che il più non sempre fa (parlo anche di funzioni oggetti o altro)





    [edit]
    avevo fatto un esempio sbagliato col number ... vabbeh, lascio a voi i tests


    [edit2]
    String.prototype.toString = function() {
    return "Io sono un oggetto";
    };
    alert("Chi sei ? ".concat("."));
    alert("Chi sei ? " + ".");



    [edit3]
    Number.prototype.toString = function() {
    return ["Io", "valgo", this * 1].join(" ");
    };
    alert("Quanto vali ? ".concat(new Number(1)));
    alert("Quanto vali ? " + new Number(1));

    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #14
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Allora, adesso non ho voglia di fare esperimenti :ignore: ma domani mattina ci provo.
    Quello che voglio è simulare un buffer tipo StringBuilder.
    Per essere più chiari, come esempio posso fare questo:
    Ho un vettore lungo. Debbo comporre una stringa aggiungendo valori del vettore.
    In codice non controllato

    var s = "<select>";
    for(var i = 0; i < vettore.length; i++)
    s += "<option>" + vettore[i] + </option>";

    s += "</select>";

    correggimi se sbaglio. (:faccina mani giunge inesistente da mettere)
    Usando il DOM si impiega un tempo esagerato.
    Usando la composizione stringa bufferizzata (tipo StringBuilder) e facendo poi innerHTML si ottengono le prestazioni migliori.

    Bene, il codice che ho scritto io, come la faresti tu? :quote:

    Pietro

  5. #15
    codice:
    var	s = ["<select>"];
    for(var i = 0, j = vettore.length; i < j; i++)
    	s.push("<option>", vettore[i], "</option>");
    s.push("</select>");
    
    elemento.innerHTML = s.join("");



    P.S. la StringBuilder per JS l'hanno già fatta ma secondo me non serve a molto ...


    [edit]
    in C# non faresti la stessa cosa così ?
    codice:
    System.StringBuilder s = new System.StringBuilder("<select>");
    for(System.Int32 i = 0, System.Int32 j = vettore.Length; i < j; i++)
    	s.Append("<option>", vettore[i], "</option>");
    s.Append("</select>");
    :master:
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #16
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da andr3a
    [code]
    in C# non faresti la stessa cosa così ?
    codice:
    System.StringBuilder s = new System.StringBuilder("<select>");
    for(System.Int32 i = 0, System.Int32 j = vettore.Length; i < j; i++)
    	s.Append("<option>", vettore[i], "</option>");
    s.Append("</select>");
    :master:
    VVoVe: :berto:

    codice:
    OleDbDataReader dr = lib.GetDataReader(MioModulo.StringaConnessioneTest, "select id_comune, nome_comune from comuni order by nome_comune");
    StringBuilder sb = new StringBuilder(50000);
    sb.Append("<select>");
    while (dr.Read()) sb.Append(string.Format("<option value=\"{0}\">{1}</option>",dr[0], dr[1]));
    sb.Append("</select>");
    :quote: che ne dici, ci scacciano dal forum oggi? io sono stato già diffidato 3 giornate di squalifica
    Pietro

  7. #17
    ecco ... in JS io farei così

    codice:
    var	sb = ["<select>"];
    for(var i = 0, j = dr.length; i < j; i++)
    	sb.push('<option value="', dr[i++], '">', dr[i], '</option>');
    sb.push("</select>");
    
    // stringa
    sb.join("");
    in pratica per queste cose nonti serve il concat perchè il join dell'array richiama, come concat, il toString in automatico e permette di aggiungere da 1 a N elementi con un solo push.

    In altri casi dove non c'è un ciclo ma più variabili da concatenare a stringa, userei concat


    var sb = '"'.concat(pippo, '"', a + b, func(z), '=', rotfl);

    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #18
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Gentilissimo Andrea, lascia perdere http://forum.html.it/forum/showthrea...readid=1046582 :berto:


    non so se ti possa interessare:

    ho caricato dal server un vettore bidimensionale dei comuni italiani (8101 comuni) tipo:

    var sjs = [ ["28001", "ABANO TERME"], ["98001", "ABBADIA CERRETO"],***

    dopo di che ho due pulsanti client che generano in un div un <select tramite innerHTML
    le due routine, la banale e la tua sono:
    codice:
    function Button1_onclick() 
    {
        var o = new TempoOperazione();
        o.Start();
        var sb = ["<select>"];
        for(var i = 0; i < sjs.length; i++)
            sb.push('<option value="' + sjs[i][0] + '">' + sjs[i][1] + '</option>');
        sb.push("</select>");
        sb.join("");
        $("div1").innerHTML = sb;
        alert(o.Secondi());
    }
    
    function Button2_onclick() 
    {
        var o = new TempoOperazione();
        o.Start();
        var sb = "<select>";
        for(var i = 0; i < sjs.length; i++)
            sb += '<option value="' + sjs[i][0] + '">' + sjs[i][1] + '</option>';
        sb += "</select>";
        $("div1").innerHTML = sb;
        alert(o.Secondi());
    }
    e vediamo i tempi di esecuzione:
    con IE6, la tua impiega 1.1 secondi, la banale, 31 secondi.

    Attento. Con Firefox 1.5 italiano non noto differenze aprezzabili, 0.5 s contro 0.6 secondi

    Con Opera 9 ottengo 0.2 secondi contro 0.4 secondi.

    In altre parole, con l'esempio che ho fatto, sembra che questi due ottimizzino la composizione di stringhe utilizzando in modo trasparente un buffer interno

    Pietro

  9. #19
    ora prova questa ...
    codice:
    function Button3_onclick() {
    	var	o = new TempoOperazione();
    	o.Start();
    	var sb = ["<select>"];
    	for(var i = 0, j = sjs.length; i < j; i++)
    		sb.push('<option value="', sjs[i][0], '">', sjs[i][1], '</option>');
    	sb.push("</select>");
    	$("div1").innerHTML = sb.join("");
    	alert(o.Secondi());
    };
    che magari funziona pure visto che nella Button1 scrivi

    sb.join("");
    $("div1").innerHTML = sb; // questo è sempre un array


    inoltre come ti ho detto push accetta più di un valore, tutti quei + non servono
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  10. #20
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    e va bene! mi sembrava strano che non trovassi un errore: comunque adesso va meglio

    Pietro

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.