Liste Iteration nimmt so viel Zeit?
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
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.