Перечислите итерацию, занимая так много времени?

StackOverflow https://stackoverflow.com/questions/3927354

  •  30-09-2019
  •  | 
  •  

Вопрос

У меня есть список (из класса). Имея 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
Это было полезно?

Решение

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

Кроме того, все направляется через стоимость, которая имеет объект типа, который является своего рода эквивалентом старого варианта VB6.

Все это будет стоить вам.

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

Вот где я бы сначала посмотрел.

Другие советы

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top