Newsgroup: it.comp.lang.visual-basic
Titolo: [!] Stringhe e memoria... problemi coi cicli...

Sembrerò professorone, presuntuoso e strafottente... ma ho notato che spesso 
si cade in un errore relativo all'oggetto del mio post da parte di neofiti 
all'argomento. Quindi faccio qui un esempio (non richiesto, lo so... spero 
di non sembrare (vedi sopra)) che magari aiuta i newbies...
In un ciclo di somma tra interi come
Dim I as Integer, C as Long
C = 0
For I = 0 to Limite
  C = C +1
Next
se provate, raddoppiando la variabile limite raddoppia anche il tempo di 
esecuzione (difficile da cronometrare perché molto rapido...)
La cosa è intuitiva e funziona bene, se faccio una cosa 2000 volte ci 
metterò il doppio che se la facessi 1000 volte...
Attenzione però, questo è vero perché C = C + 1 è un'operazione che impiega 
un tempo fisso per essere eseguita. A qualunque valore di C l'operazione 
impiega un tempo t sempre uguale...
Se invece.....
Dim S as String, I as Integer
S = ""
For I = 0 to Limite
  S = S + Chr(0)
Next
Questo non è più vero, con l'aumentare di Limite, il tempo aumenta 
esponenzialmente..
Poiché l'istruzione di assegnamento S = S+Chr(0) non impiega sempre lo 
stesso tempo, per l'istruzione di assegnamento prima vb risolve la parte 
destra dell'uguale, copia la stringa S in una zona di memoria temporanea, 
accoda Chr(0) e rimette il risultato dentro s, aggiornandone la lunghezza.
Questa operazione al primo ciclo deve muovere (quando copia la stringa s 
nella zona di memoria temporanea) una stringa di pochi caratteri 
(oltrettutto unicode quindi 2 byte per carattere), mentre alla 100000-esima 
iterazione la stringa da muovere sarà di 100000 caratteri, quindi dovrà 
spostare una stringa molto più grande, e così via...
Ad ogni passaggio l'istruzione S = S + Chr(0) è più lenta della precedene 
volta....
Un WorkAround a tale cosa può essere predimensionare la stringa
S = Space (Limite+1)
e introdurre il carattere con
MID(S,I-1,1) = Chr(0)
così da accedere direttamente alla stringa senza costringere vb a spostarla 
tutte le volte
Sperando di essere d'aiuto a chi cozza contro questo problema
Ric 


complimenti! spiegazione esaustiva, e concordo pienamente

Beh di tanto in tanto fa proprio bene un post che spiega e non risponde
ad alcuna domanda :)
Comunque effettivamente č un metodo che anche io ho utilizzato per
leggere e parsare file di testo di grosse dimensioni per darli in output
a MySQL. Mi toccava costruire una query che, raggiunti circa 4kb di
dimensione doveva essere spedita al database. E raggiungere i 4k
semplicemente con la concatenazione diventata piuttosto lento, cosě
tantovaleva "allocare" la stringa all'inizio, e usare mid$ per
popolarla...
Cosě č super-rapido :)
-- 
Quando noi ignoranti eravamo di piů, tutto era piů bello...
(A. Celentano)
Per rispondermi in privato, prima togli l'immondizia dalla testa ;)

Deserti Riccardo ha scritto:

Non appena rimetto il SC online, lo inserisco nelle FAQ.
bye

 Sperando di essere d'aiuto a chi cozza contro questo problema
Idem :-)
Bye, G.

"Paperino" <non...@lo.dico> ha scritto nel messaggio news:dhgns0$u26$1...@stargate1.inet.it...

ha ragione, chapeau!
--
bye.
________________________
http://salclem2.altervista.org/
http://netuser.altervista.org/
http://pmonitor.altervista.org/

 Non appena rimetto il SC online, lo inserisco nelle FAQ.
Ecco, scusa, ci sono previsioni?
In questi giorni ho cercato su Google una soluzione ad un
problema, ho trovato alcuni articoli che però rimandano
(ovviamente) al sito comune che non è accessibile...
P.S.: ho letto dei problemi che hai avuto... ma non c'è
scritto per quando prevedi di riattivare il tutto.
Grazie.
Mauro