vorrei sapere se in asp sia possibile bufferizzare le stringhe.
Mi spiego:
in un ciclo di lettura recordset, metto
s = s & ", " & rs("campo")
questa istruzione rallenta notevolmente la restituzione della pagina
vorrei sapere se in asp sia possibile bufferizzare le stringhe.
Mi spiego:
in un ciclo di lettura recordset, metto
s = s & ", " & rs("campo")
questa istruzione rallenta notevolmente la restituzione della pagina
Pietro
Esiste un metodo dell'oggetto recordset (getstring se non mi sbaglio) che ti restituisce direttamente una stringa formattata come vuoi tu.
Scusate i puntini di sospensione...... La verità è che non ho argomenti....
Sì, comincio a ricordare. GrazieOriginariamente inviato da kalosjo
Esiste un metodo dell'oggetto recordset (getstring se non mi sbaglio) che ti restituisce direttamente una stringa formattata come vuoi tu.![]()
Pietro
Questa classe migliora le prestazioni.
Un esempiocodice:Class cString Private Buffer Private Sub Class_Initialize() Set Buffer = Server.CreateObject("ADODB.Stream") Buffer.Charset = "ISO-8859-1" Buffer.Type = 2 Buffer.Open() End Sub Public Function ToArray() Dim Ar(),i Redim Ar(Buffer.Size) Buffer.Position = 0 For i=0 to Buffer.Size Ar(i)=Buffer.ReadText(1) Next ToArray = Ar End Function Public Function Clear() On error resume next Buffer.Close() on error goto 0 Buffer.Open() End Function Public Sub Append(byRef value) Buffer.WriteText(value) End Sub Public Sub AppendLine(byRef value) Buffer.WriteText(value & VbCrLf) End Sub Public Function GetIndex(Index) Dim p p = Buffer.Position Seek(Index) GetIndex = Read(1) Buffer.Position = p End Function Public Function Read(Bytes) Read = Buffer.ReadText(Bytes) End Function Public Sub Seek(Position) Buffer.Position = Position End Sub Public Sub Skip(Value) Buffer.Position = Buffer.Position + Value End Sub Public default Function GetBuffer() Seek(0) GetBuffer = Buffer.ReadText() End Function Public Function Length() Length = Buffer.Size End Function Private Function MapPath(s) Dim Res on error resume next Res = Server.MapPath(s) if err.number<>0 then REs = s on error goto 0 MapPath = Res End Function Public Sub SaveToFile(FileName,OverWrite) FileName = MapPath(FileName) If OverWrite=1 then OverWrite=false elseif OverWrite=2 then OverWrite=true End if Buffer.SaveToFile FileName,OverWrite End Sub Private Sub Class_Terminate() Buffer.Close() Set Buffer = Nothing End Sub End Class
La classe serve anche (e soprattutto per altri scopi. Ad esempio è possibile accedere alla string come se fosse un Array (Funzione GetIndex) oppure è possibile convertirla in un Array in modo molto veloce (non si utilizza naturlmente il mid. La fiunzione è ToArray()).Seek Consente il posizionamente del puntatore interno. Skip consente il salto caratteri.Length è la lungezza (s.length). Clear svuota l'oggetto. AppendLine fa un inserimento del tipo Stranga + VbCrLF.codice:Set s = new cString s.Append(",") s.Append("Ciao") s.Append("Test") Response.Write(s)
Con l'utilizzo di parametri opzionali (in vbscript è possibile usarli) la classe si fa più interessante e completa.
Ciao
Non si finisce mai di imparare. Archivio e studio.
Per il momento grazie :gren:
Pietro
Ebbene, ho fatto alcune prove ed i risultati sono a dir poco impressionanti.
Dunque, supponiamo di leggere un recordset di 30.000 record di 2 campi e con questi, costruiamo un vettore da utilizzare in javascript. Per esempio:
var v = ["Stefano", "Carlo", "Nicola", ... ];
ebbene, con 30.000 record, in un semplice ciclo for, l'istruzione
s = s & nome ha impiegato circa 40 secondi. L'utilizzo della classe di cui sopra, circa 0,70 secondi. Ma la scrittura diretta mischiando html col tag <%, ha impiegato circa 0,01 secondo![]()
In altri termini, la scrittura diretta è praticamente istantanea, ma la sua scrittura non è certo elegante. L'uso della classe di cui sopra è 40 volte più lenta, ma i tempi sono comunque inferiori al secondo e inoltre il codice è molto più leggibile ed elegante. Con l'istruzione s = s & stringa, asp corre il serio pericolo di piantarsi, in pratica c'è da spararsi![]()
Ciao![]()
Pietro
Sai che non ho capito.
E' più veloce o più lenta? "L'uso della classe di cui sopra è 40 volte più lenta"
E cosa intendi per scrittura diretta col tag <% ? Intendi senza bufferizzare la stringa?
[QUOTEMa la scrittura diretta mischiando html col tag <%[/QUOTE]
questo modo di scrivere codice è quello che dà maggiori prestazioni![]()
![]()
ho fatto questo esempio solo per farmi un'ideaOriginariamente inviato da Baol74
Non ho ben capito!
E' più veloce o più lenta? "L'uso della classe di cui sopra è 40 volte più lenta"
E cosa intendi per scrittura diretta col tag <% ?
1) l'istruzione s &= stringa è assolutamente lenta
2) l'uso della tua classe mi è risultata circa 60 volte più veloce
3) la scrittura diretta nella pagina però è a sua volta circa 40 volte più veloce
prova l'esempio
codice:<%@ Language=VBScript %> <% option explicit dim s1, s2, i, n, TimeIt1, TimeIt2, StartTime, EndTime n = 30000 StartTime = timer s1 = "" for i = 1 to n s1 = s1 & "|1234567890" next EndTime = timer TimeIt1 = EndTime - StartTime StartTime = timer Set s2 = new cString for i = 1 to n s2.Append("|1234567890") next EndTime = timer TimeIt2 = EndTime - StartTime %> <HTML> <HEAD> <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0"> </HEAD> <BODY> Tempo1 = <%=TimeIt1%></P> Tempo2 = <%=TimeIt2%></P> s1 = <%=s1%></P> s2 = <%=s2%></P> <% dim TimeIt3 StartTime = timer for i = 1 to n %> |1234567890 <%next EndTime = timer TimeIt3 = EndTime - StartTime %> Tempo3 = <%=TimeIt3%></P> </BODY> </HTML> <% Class cString Private Buffer Private Sub Class_Initialize() Set Buffer = Server.CreateObject("ADODB.Stream") Buffer.Charset = "ISO-8859-1" Buffer.Type = 2 Buffer.Open() End Sub Public Function ToArray() Dim Ar(),i Redim Ar(Buffer.Size) Buffer.Position = 0 For i=0 to Buffer.Size Ar(i)=Buffer.ReadText(1) Next ToArray = Ar End Function Public Function Clear() On error resume next Buffer.Close() on error goto 0 Buffer.Open() End Function Public Sub Append(byRef value) Buffer.WriteText(value) End Sub Public Sub AppendLine(byRef value) Buffer.WriteText(value & VbCrLf) End Sub Public Function GetIndex(Index) Dim p p = Buffer.Position Seek(Index) GetIndex = Read(1) Buffer.Position = p End Function Public Function Read(Bytes) Read = Buffer.ReadText(Bytes) End Function Public Sub Seek(Position) Buffer.Position = Position End Sub Public Sub Skip(Value) Buffer.Position = Buffer.Position + Value End Sub Public default Function GetBuffer() Seek(0) GetBuffer = Buffer.ReadText() End Function Public Function Length() Length = Buffer.Size End Function Private Function MapPath(s) Dim Res on error resume next Res = Server.MapPath(s) if err.number<>0 then REs = s on error goto 0 MapPath = Res End Function Public Sub SaveToFile(FileName,OverWrite) FileName = MapPath(FileName) If OverWrite=1 then OverWrite=false elseif OverWrite=2 then OverWrite=true End if Buffer.SaveToFile FileName,OverWrite End Sub Private Sub Class_Terminate() Buffer.Close() Set Buffer = Nothing End Sub End Class 'Un esempio 'Set s = new cString 's.Append(",") 's.Append("Ciao") 's.Append("Test") 'Response.Write(s) 'La classe serve anche (e soprattutto per altri scopi. 'Ad esempio è possibile accedere alla string come se fosse un Array (Funzione GetIndex) 'oppure è possibile convertirla in un Array in modo molto veloce '(non si utilizza naturlmente il mid. La fiunzione è ToArray()).Seek 'Consente il posizionamente del puntatore interno. 'Skip consente il salto caratteri. 'Length è la lungezza (s.length). 'Clear svuota l'oggetto. 'AppendLine fa un inserimento del tipo Stranga + VbCrLF. ' 'Con l'utilizzo di parametri opzionali (in vbscript è possibile usarli) 'la classe si fa più interessante e completa. %>
Pietro
ok. Non avevo capito l'ultimo passaggio.
Certo è che l'invio diretto non comporta memorizzazione e quindi stress della cpu.
ciao