2010-10-13 94 views
-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 
+0

-1:毫无疑问! – 2010-10-13 19:54:27

+0

问题。如何减少这个时间? – James123 2010-10-13 20:00:32

+0

目前正在进行多少时间,您认为可以接受的时间是多少? – 2010-10-14 17:29:16

回答

2

很难从代码中知道你在做什么,但是使用PropertyInfo是一个非常大的线索,有一些反思(以及GetValue的使用)。另外,一切都是通过VALUE进行的,这是一种对象类型,与旧的vb6 VARIANT类似.net。

所有这些类型转换都会让你付出代价。相反,如果有办法让PROPS列表进入某种已经键入的对象,所以你可以避免所有的ISINT,ISDATE等,调用和GetValue调用,你应该看到一个相当不错的增加速度。

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

1

除了“迭代少数据”,我没有看到一个简单的解决方案。你需要做多少工作,比如(records * fields_per_record);你坚持通过你的内循环约162,000次给你提供的数字。

+0

我必须填写Excel中的所有单元格。所以我需要所有的属性值。 – James123 2010-10-13 20:01:50

+0

好的,也许这样看待它 - 我可以告诉你,你正在做的是填充一个巨大的Excel电子表格。不知道你在做什么的其他事情,Excel是这份工作的正确工具吗? – twon33 2010-10-13 20:43:11

0

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

+0

不是一个坏主意......这不值得.. – James123 2010-10-13 20:44:55

0

首先,你的代码是一团糟。如果在报告中的For Each内的循环中,缩进不明确,并且iRow递增。我怀疑你是一遍又一遍地迭代相同的数据。

其次,在每一行中,您都会一遍又一遍地测试列所具有的类型。现在,由于props未被分配到列表中,因此可以通过以某种方式缓存它们具有的类型来删除IsIntIsDate测试。另外,如果您可以在循环遍历属性之前预先分配单个行的所有单元格,则可能会在性能方面获得不错的收益!

但是,正如其他人已经指出的,什么也没有在这将改变你的代码的复杂性。它将始终保持O(number of rows * number of cells),这意味着当您将数据量加倍时,您应该期望将计算时间加倍。