-1

我有(类)列表。有 1800 个计数,每个对象有 90 个属性。当我用 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

4 回答 4

2

很难从代码片段中看出你在做什么,但使用 PropertyInfo 是一个相当大的线索,表明正在进行一些反思(以及 GetValue 的使用)。

此外,一切都通过 VALUE 汇集,它是 object 类型的,它是旧 vb6 VARIANT 的 .net 等价物。

所有这些类型转换都会让你付出代价。

相反,如果有办法将 PROPS 列表放入某种类型的已键入对象中,这样您就可以避免所有 ISINT、ISDATE 等调用和 GetValue 调用,您应该会看到相当不错的速度提高。

那是我首先要看的地方。

于 2010-10-13T20:18:45.373 回答
1

除了“迭代更少的数据”之外,我在这里看不到一个简单的解决方案。你需要做多少工作,比如 (records*fields_per_record); 鉴于您提供的数字,您被困在通过您的内部循环约 162,000 次。

于 2010-10-13T19:49:34.970 回答
0

购买更快的处理器并添加更多内存。

于 2010-10-13T20:27:20.060 回答
0

首先,您的代码一团糟。缩进不清楚,并且在 a on 报告iRow中时在循环中递增。For Each我怀疑你一遍又一遍地迭代相同的数据。

其次,在每一行,你一遍又一遍地测试列的类型。现在,由于props没有分配到列表内部,一个相当大的优化是通过以某种方式缓存它们拥有的类型来删除IsInt和测试。IsDate

此外,如果您可以在循环遍历属性之前为单行预分配所有单元格,您可能会获得不错的性能提升!

但是,正如其他人指出的那样,不会改变您代码的复杂性。它将始终保持O(number of rows * number of cells),这意味着当您将数据量增加一倍时,您应该期望计算时间增加一倍。

于 2010-10-14T02:20:43.610 回答