列表迭代花了这么多时间?

时间:2010-10-13 19:40:51

标签: asp.net vb.net hssf

我有List(班级)。有1800个计数,每个对象有90个属性。当我用90个属性来分析earch时间越来越长。如何解决这个问题

 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 个答案:

答案 0 :(得分:2)

很难从代码中了解你正在做什么,但使用PropertyInfo是一个非常大的线索,有一些反思(使用GetValue)。

此外,所有内容都通过VALUE进行汇集,这是一个类型为object的类型,它类似于旧的vb6 VARIANT .net文件。

所有类型转换都会花费你。

相反,如果有办法将PROPS列表放入某种已经输入的对象中,那么你可以避免所有的ISINT,ISDATE等调用和GetValue调用,你会看到速度相当不错的增加

这就是我首先要看的地方。

答案 1 :(得分:1)

除了“迭代更少的数据”之外,我在这里看不到直接的解决方案。你需要做多少工作如(records * fields_per_record);考虑到你提供的数字,你被困在内圈〜162,000次。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

首先,你的代码是一团糟。缩进不清楚,如果在报告中iRow内的循环中,则For Each递增。我怀疑你一遍又一遍地重复相同的数据。

其次,在每一行中,您反复测试列的类型。现在,由于props未分配到列表中,因此通过以某种方式缓存IsIntIsDate测试,可以进行相当大的优化。

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

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