-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 の使用)。

さらに、すべてが、古い vb6 VARIANT に相当する .net の一種であるオブジェクト型である VALUE を通過します。

その型キャストはすべてあなたに費用がかかります。

代わりに、PROPS リストをある種の既に型付けされたオブジェクトに取得する方法があれば、ISINT、ISDATE などのすべての呼び出しと GetValue 呼び出しを回避でき、速度がかなり向上するはずです。

私が最初に見たのはそこです。

于 2010-10-13T20:18:45.373 に答える
1

「より少ないデータを反復する」以外に、ここでの簡単な解決策は見当たりません。(records*fields_per_record); のようにスケールする必要がある作業量。あなたが提供した数字を考えると、内部ループを約162,000回通過するのに苦労しています。

于 2010-10-13T19:49:34.970 に答える
0

まず第一に、あなたのコードは混乱しています。インデントが不明瞭で、レポートiRowの内部でループしている場合はインクリメントされます。For Each同じデータを何度も繰り返しているのではないかと思います。

次に、各行で、列の型を何度もテストします。現在、propsはリスト内に割り当てられていないため、かなりの最適化は、それらが持つ型を何らかの方法でキャッシュして削除IsIntし、テストすることです。IsDate

また、プロパティをループする前にすべてのセルを 1 つの行に事前に割り当てることができれば、パフォーマンスが大幅に向上する可能性があります。

ただし、他の人が指摘したように、これでコードの複雑さが変わることはありません。O(number of rows * number of cells)つまり、データ量が 2 倍になると、計算時間も 2 倍になることが予想されます。

于 2010-10-14T02:20:43.610 に答える
0

より高速なプロセッサを購入し、メモリを追加します。

于 2010-10-13T20:27:20.060 に答える