Frage

Ich habe Liste (die Klasse). mit 1800 Zähl- und jedes Objekt 90 Objekte. Als ich Terate uche mit 90 Eigenschaften mehr und mehr Zeit. Wie dies

lösen
 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
War es hilfreich?

Lösung

Es ist schwer, aus dem Code-Schnipsel zu sagen, was Sie tun, aber mit Propertyinfo ist eine ziemlich große Ahnung, dass es einige Reflexion geht (das und die Verwendung von GetValue).

Ferner wird alles durch VALUE schleusen, die vom Typ Objekt ist, die Art des .net-Äquivalent der alten VB6 VARIANT ist.

Alles, was eine Schublade gesteckt wird Sie kosten.

Stattdessen, wenn es Art und Weise war die REQUISITEN Liste in eine Art von bereits typisierte Objekte zu bekommen, so dass Sie alle iSINT, ISDATE vermeiden könnte, etc, Anrufe und die GetValue Anrufe, sollten Sie eine ziemlich anständige Erhöhung der Geschwindigkeit sehen .

Das ist, wo ich zum ersten Mal sehen würde.

Andere Tipps

Anders als „Iterierte über weniger Daten,“ Ich weiß nicht, eine einfache Lösung, die hier sehen. Wie viel Arbeit, die Sie tun müssen, um Schuppen wie (Aufzeichnungen * fields_per_record); Sie sitzen fest, das durch Ihre innere Schleife ~ 162.000 mal die Zahlen gegeben Ihnen zur Verfügung gestellt.

Kaufen Sie einen schnelleren Prozessor und fügen Sie etwas mehr Speicher.

Firstt things first, ist der Code ein Chaos. Die Vertiefung ist unklar und iRow wird erhöht, wenn in einer Schleife, wenn innerhalb eines For Each auf Berichte. Ich vermute, Sie Iterieren über die gleichen Daten sind immer und immer wieder.

Zweitens, bei jeder Zeile, testen Sie immer und immer wieder, welche Arten die Spalten haben. Da nun props nicht in der Liste, eine beträchtliche Optimierung wäre IsInt und IsDate Tests zu entfernen, indem Sie irgendwie das Caching, welche Arten sie zugeordnet ist.

Auch wenn Sie alle Zellen für eine einzelne Zeile vor Schleifen über die Eigenschaften preallocate kann, könnte man einen schönen Gewinn in der Leistung bekommen!

Wie jedoch andere haben darauf hingewiesen, nichts in diesem Code Komplexität ändern wird. Es wird immer O(number of rows * number of cells) bleiben, was bedeutet, wie Sie die Datenmenge verdoppeln, sollten Sie erwarten, dass die Rechenzeit zu verdoppeln.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top