Question

Je Liste (de classe). 1800 ayant de comptage et chaque objet a des 90 propriétés. Quand je Terate Earch avec 90 propriétés en prenant de plus en plus de temps. Comment résoudre ce

 Dim cellIntStyle As HSSFCellStyle = hssfworkbook.CreateCellStyle
 cellIntStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("#")

 Dim cellDateStyle As HSSFCellStyle = hssfworkbook.CreateCellStyle
 cellDateStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat(Format
                                                     ("dd-MMM-yyyy"))
 For Each mReport As Report In dtExcel
        row = sheet1.CreateRow(iRow)
        j = 0
        For Each prop As PropertyInfo In props
            Dim value As Object = prop.GetValue(mReport, Nothing)
            If IsInt(value) Then
                CreateRow(row, j, CType(value, Integer), cellIntStyle)
            ElseIf IsDate(value) Then
                CreateRow(row, j, String.Format("{0:dd-MMM-yyyy}", 
                                          value), cellDateStyle)
            Else
                CreateRow(row, j, value)
            End If
            j = j + 1
        Next

        iRow = iRow + 1 // Coming here taking so long... how to make it fast.
    Next



    Private Sub CreateRow(ByRef row As HSSFRow, ByVal colId As Integer, 
                                          ByVal value As String)
        row.CreateCell(colId).SetCellValue(value)
    End Sub
    Private Sub CreateRow(ByRef row As HSSFRow, ByVal colId As Integer, 
                                ByVal value As Integer, 
                                ByVal cellStyle As HSSFCellStyle)
        Dim cell As HSSFCell = row.CreateCell(colId)
        cell.SetCellValue(value)
        cell.CellStyle = cellStyle
    End Sub
    Private Sub CreateRow(ByRef row As HSSFRow, ByVal colId As Integer, 
                                                ByVal value As String, 
                                      ByVal cellStyle As HSSFCellStyle)
        Dim cell As HSSFCell = row.CreateCell(colId)
        cell.SetCellValue(value)
        cell.CellStyle = cellStyle
    End Sub
Était-ce utile?

La solution

Il est difficile de dire à partir du code snip ce que vous faites, mais en utilisant PropertyInfo est un indice assez grand qu'il ya une réflexion en cours (qui et l'utilisation de GetValue).

De plus, tout est canalise par la valeur qui est l'objet de type, ce qui est un peu l'équivalent de l'ancien .net VARIANT VB6.

Tout ce que transtypage va vous coûter cher.

Au lieu de cela, il y avait moyen d'obtenir la liste des PROPS dans une sorte d'objets déjà typés, de sorte que vous pouvez éviter tous les isint, ISDATE, etc, les appels et les appels GetValue, vous devriez voir une augmentation assez décent vitesse .

C'est où je regarde d'abord.

Autres conseils

Autre que « itérer sur moins de données, » je ne vois pas une solution simple ici. Combien de travail que vous avez à faire des cuirasses comme (enregistrements * fields_per_record); vous passez coincé dans votre boucle interne ~ 162.000 fois donné les chiffres que vous avez fournis.

Acheter un processeur plus rapide et ajouter un peu plus de mémoire.

choses Firstt d'abord, votre code est un gâchis. L'empreinte est pas claire et iRow est incrémentée est si dans une boucle lorsque l'intérieur d'un For Each sur les rapports. Je suppose que vous itérez les mêmes données et encore.

En second lieu, à chaque ligne, vous tester encore et encore quels types les colonnes ont. Maintenant, puisque props n'est pas affecté à l'intérieur de la liste, une optimisation considérable serait de supprimer les tests de IsInt et IsDate en mettant en cache en quelque sorte leurs types.

En outre, si vous pouvez preallocate toutes les cellules pour une seule ligne avant boucle sur les propriétés, vous pourriez obtenir un gain de performance agréable!

Cependant, comme d'autres l'ont souligné, rien dans ce altéreront la complexité de votre code. Il restera toujours O(number of rows * number of cells), ce qui signifie que vous doublez la quantité de données, vous devriez vous attendre à doubler le temps de calcul.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top