Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116

    in asp è possibile bufferizzare le stringhe?

    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

  2. #2
    Moderatore di CMS L'avatar di kalosjo
    Registrato dal
    Jul 2001
    residenza
    In culo alla luna
    Messaggi
    1,999
    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....

  3. #3
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da kalosjo
    Esiste un metodo dell'oggetto recordset (getstring se non mi sbaglio) che ti restituisce direttamente una stringa formattata come vuoi tu.
    Sì, comincio a ricordare. Grazie
    Pietro

  4. #4
    Utente di HTML.it L'avatar di Baol74
    Registrato dal
    Jul 2002
    Messaggi
    2,004
    Questa classe migliora le prestazioni.
    codice:
    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

    codice:
    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.

    Ciao

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Non si finisce mai di imparare. Archivio e studio.
    Per il momento grazie :gren:
    Pietro

  6. #6
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    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

  7. #7
    Utente di HTML.it L'avatar di Baol74
    Registrato dal
    Jul 2002
    Messaggi
    2,004
    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?

  8. #8
    [QUOTEMa la scrittura diretta mischiando html col tag <%[/QUOTE]
    questo modo di scrivere codice è quello che dà maggiori prestazioni

  9. #9
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente 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 <% ?
    ho fatto questo esempio solo per farmi un'idea
    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

  10. #10
    Utente di HTML.it L'avatar di Baol74
    Registrato dal
    Jul 2002
    Messaggi
    2,004
    ok. Non avevo capito l'ultimo passaggio.

    Certo è che l'invio diretto non comporta memorizzazione e quindi stress della cpu.

    ciao

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 © 2025 vBulletin Solutions, Inc. All rights reserved.