Повторение списка занимает так много времени? - PullRequest
0 голосов
/ 13 октября 2010

У меня есть список (класса). имеет 1800 единиц и каждый объект имеет 90 свойств. Когда я теряю earch с 90 свойствами, требуется все больше и больше времени. Как решить эту проблему

 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

Ответы [ 4 ]

2 голосов
/ 14 октября 2010

Сложно понять из фрагмента кода, что вы делаете, но использование PropertyInfo - довольно большая подсказка, что происходит некоторое размышление (это и использование GetValue).

Далее, все идет через VALUE типа объекта, который является своего рода .net-эквивалентом старого vb6 VARIANT.

Все, что приведение типов будет стоить вам.

Вместо этого, если есть способ получить список PROPS в какие-то уже типизированные объекты, чтобы вы могли избежать всех вызовов ISINT, ISDATE и т. Д., А также вызовов GetValue, вы должны увидеть довольно приличное увеличение скорости. .

Вот где бы я посмотрел первым.

1 голос
/ 13 октября 2010

Кроме «перебора меньшего количества данных», я не вижу здесь простого решения.Как много работы вам нужно сделать, например, (records * fields_per_record);Вы застряли, проходя через свой внутренний цикл ~ 162 000 раз, учитывая предоставленные вами цифры.

0 голосов
/ 14 октября 2010

Во-первых, ваш код - беспорядок. Отступ неясен, и iRow увеличивается, если находится в цикле, когда находится внутри For Each в отчетах. Я подозреваю, что вы перебираете одни и те же данные снова и снова.

Во-вторых, в каждой строке вы снова и снова проверяете типы столбцов. Теперь, поскольку props не назначено внутри списка, значительная оптимизация будет заключаться в том, чтобы удалить IsInt и IsDate тесты, каким-то образом кэшируя, какие у них типы.

Кроме того, если вы можете предварительно выделить все ячейки для одной строки перед циклом по свойствам, вы можете получить хороший прирост производительности!

Однако, как уже отмечали другие, ничего в этом не изменит сложности вашего кода. Он всегда останется O(number of rows * number of cells), т. Е. При удвоении объема данных следует ожидать удвоения времени вычислений.

0 голосов
/ 14 октября 2010

Купите более быстрый процессор и добавьте немного памяти.

...