Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    1,482

    Ciclo su datatable troppo lungo

    codice:
                    With DS.Tables("TblResult")
                        For Each c As DataColumn In .Columns
                            StrRecordset &= c.ColumnName
                            If c.Ordinal < .Columns.Count - 1 Then
                                StrRecordset &= vbTab
                            End If
                        Next
                        StrRecordset &= "{NL}"
                        For Each r As DataRow In .Rows
                            For Each c As DataColumn In .Columns
                                StrRecordset &= r(c)
                                If c.Ordinal < .Columns.Count - 1 Then
                                    StrRecordset &= vbTab
                                End If
                            Next
                            StrRecordset &= "{NL}"
                        Next
                    End With
    questo ciclo (contenuto in un webservice), fatto su di un datatable con 1000 righe e 20 colonne ci impiega all'inirca 4 minuti...

    c'è secondo voi un modo per velocizzare il tutto?

    Hey hey, my my Rock and roll can never die!

  2. #2
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    38 secondi contro 0.2 secondi

    codice:
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            Dim t As New TempoOperazione
            t.Start()
            Dim dt As DataTable = Libreria.GetDataTable(StringaConnessioneSITAE, "SELECT * FROM PROTOCOLLO")
    
            Dim StrRecorset$ = ""
            For Each c As DataColumn In dt.Columns
                StrRecorset &= c.ColumnName
                If c.Ordinal < dt.Columns.Count - 1 Then
                    StrRecorset &= ControlChars.Tab
                End If
            Next
            StrRecorset &= "{NL}"
            For Each r As DataRow In dt.Rows
                For Each c As DataColumn In dt.Columns
                    StrRecorset &= Libreria.NullToString(r(c))
                    If c.Ordinal < dt.Columns.Count - 1 Then
                        StrRecorset &= ControlChars.Tab
                    End If
                Next
                StrRecorset &= "{NL}"
            Next
    
    
            t.End()
            PrintLn(t.Secondi)
            PrintLn(StrRecorset)
    
        End Sub


    codice:
        Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
            Dim t As New TempoOperazione
            t.Start()
            Dim dt As DataTable = Libreria.GetDataTable(StringaConnessioneSITAE, "SELECT * FROM PROTOCOLLO")
    
            Dim StrRecorset As New StringBuilder(10000)
            For Each c As DataColumn In dt.Columns
                StrRecorset.Append(c.ColumnName)
                If c.Ordinal < dt.Columns.Count - 1 Then
                    StrRecorset.Append(ControlChars.Tab)
                End If
            Next
            StrRecorset.Append("{NL}")
            For Each r As DataRow In dt.Rows
                For Each c As DataColumn In dt.Columns
                    StrRecorset.Append(Libreria.NullToString(r(c)))
                    If c.Ordinal < dt.Columns.Count - 1 Then
                        StrRecorset.Append(ControlChars.Tab)
                    End If
                Next
                StrRecorset.Append("{NL}")
            Next
    
    
            t.End()
            PrintLn(t.Secondi)
            PrintLn(StrRecorset.ToString)
    
        End Sub
    Pietro

  3. #3
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    1,482
    miticooooooooo!

    Hey hey, my my Rock and roll can never die!

  4. #4
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Quindi, la dritta è usare la classe StringBuilder col suo metodo .Append invece di una Stringa normale ?

    Davvero velocizza così tanto ?

    Noto poi che Pietro usa direttamente un DataTable ...
    PS : Ora però ci posti anche la classe TempoOperazione

  5. #5
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da djciko
    Quindi, la dritta è usare la classe StringBuilder col suo metodo .Append invece di una Stringa normale ?

    Davvero velocizza così tanto ?

    Noto poi che Pietro usa direttamente un DataTable ...
    PS : Ora però ci posti anche la classe TempoOperazione
    allora, ho provato con una tabella di 1000 record di circa 35 campi. E i tempi sono quelli

    Per quanto riguarda la classe TempoOperazione:

    se( non sai fare 1+1=2)
    {
    non la mando tanto non la capiresti
    }
    altrimenti se (sai fare 1+1=2)
    {
    non la mando perchè tanto la sai fare da solo
    }
    altrimenti se(usi o credi di usare c#)
    {
    non te la mando così impari a farti le classi
    }
    altrimenti se (usi il basic)
    {
    sei simpatico e te la mando
    }
    Pietro

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2001
    Messaggi
    1,482
    io sono passato da 4 minuti a 2 secondi...

    Hey hey, my my Rock and roll can never die!

  7. #7
    Utente di HTML.it L'avatar di pietro09
    Registrato dal
    Jan 2002
    Messaggi
    10,116
    Originariamente inviato da zampa28
    io sono passato da 4 minuti a 2 secondi...
    cioè, in propozione, da circa 24 secondi a 0.2 secondi e più o meno la proporzione ritorna.

    Adesso sono inquriosito se si ottiene qualche miglioramento precalcolando il numero di righe e il numero di colonne e usando nei cicli qualcosa del genere:
    for i=0 to NumeroRighe - 1
    ***

    oppure utilizzando qualcosa come:

    dim e as IEnumerator = v.GetEnumerator()
    While (e.MoveNext())
    ****

    Pietro

  8. #8
    Utente di HTML.it L'avatar di Legnetto
    Registrato dal
    May 2002
    Messaggi
    1,419
    Originariamente inviato da djciko
    Quindi, la dritta è usare la classe StringBuilder col suo metodo .Append invece di una Stringa normale ?

    Davvero velocizza così tanto ?

    Noto poi che Pietro usa direttamente un DataTable ...
    PS : Ora però ci posti anche la classe TempoOperazione
    Quando usi una stringa normale ogni volta che aggiungi o togli qualcosa, viene creata una nuova istanza della stessa, la classe stringbuilder è nata proprio per ovviare a questo problema.
    Io lo uso moltissimo per creare quando mi serve l'html di una pagina.
    Ciao

  9. #9
    Moderatore di ASP.net L'avatar di djciko
    Registrato dal
    Nov 2002
    Messaggi
    6,887
    Originariamente inviato da Legnetto
    Quando usi una stringa normale ogni volta che aggiungi o togli qualcosa, viene creata una nuova istanza della stessa, la classe stringbuilder è nata proprio per ovviare a questo problema.
    Io lo uso moltissimo per creare quando mi serve l'html di una pagina.
    Ciao
    infatti, dal reference:

    codice:
    L'oggetto String non è modificabile. 
    Ogni volta che si utilizza uno dei metodi 
    nella classe System.String si crea un nuovo 
    oggetto Stringa in memoria, che richiede 
    una nuova allocazione di spazio. 
    In situazioni nelle quali è 
    necessario modificare ripetutamente 
    una stringa, la creazione di un nuovo 
    oggetto String può causare un overhead. 
    Per modificare una stringa senza creare 
    un nuovo oggetto si può utilizzare la classe System.Text.StringBuilder. Utilizzando 
    ad esempio la classe StringBuilder è 
    possibile migliorare le prestazioni 
    in caso di concatenamento di più stringhe 
    in un ciclo.

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.