2010-10-13 13 views
-1

J'ai Liste (de classe). ayant 1800 de compte et chaque objet a 90 propriétés. Quand j'existe avec 90 propriétés prenant de plus en plus de temps. Comment résoudre ceciL'itération de liste prend tellement de temps?

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: il n'y a pas de doute! –

+0

Question .. Comment réduire le temps dans ce domaine? – James123

+0

Combien de temps consacrez-vous actuellement et que considéreriez-vous comme une période acceptable? –

Répondre

2

Il est difficile de dire à partir du code snip ce que vous faites, mais l'utilisation de PropertyInfo est un très bon indice qu'il y a une réflexion en cours (cela et l'utilisation de GetValue).

En outre, tout est entonnoir via VALUE qui est de type objet, qui est une sorte de l'équivalent .net de l'ancien vb6 VARIANT.

Tout ce typecasting va vous coûter cher. Au lieu de cela, s'il y avait moyen d'obtenir la liste PROPS dans une sorte d'objets déjà tapés, afin que vous puissiez éviter tous les appels ISINT, ISDATE, etc, et les appels GetValue, vous devriez voir une augmentation assez décente dans la vitesse.

Voilà où je regarderais d'abord.

1

À part «parcourir moins de données», je ne vois pas de solution simple ici. Combien de travail vous devez faire échelles comme (records * fields_per_record); vous êtes coincé en passant par votre boucle intérieure ~ 162 000 fois compte tenu des chiffres que vous avez fournis.

+0

Je dois remplir toutes les cellules dans Excel .. J'ai donc besoin de toutes les valeurs de la propriété. – James123

+0

Ok, peut-être que je le vois plutôt comme ça - je peux dire que ce que vous faites est de remplir une énorme feuille de calcul Excel. Ne sachant rien d'autre sur ce que vous faites, Excel est-il le bon outil pour ce travail? – twon33

0

Achetez un processeur plus rapide et ajoutez plus de mémoire.

+0

Pas une mauvaise idée ... Il ne vaut pas la peine .. – James123

0

Commencez par les choses d'abord, votre code est en désordre. L'indentation n'est pas claire et iRow est incrémenté est si dans une boucle à l'intérieur d'un For Each sur les rapports. Je suppose que vous répétez les mêmes données encore et encore. Deuxièmement, à chaque rangée, vous testez encore et encore quels types les colonnes ont. Maintenant, puisque props n'est pas affecté à l'intérieur de la liste, une optimisation considérable serait d'enlever IsInt et IsDate tests en quelque sorte en mettant en cache quels types ils ont. En outre, si vous pouvez pré-allouer toutes les cellules pour une seule ligne avant de boucler sur les propriétés, vous pourriez obtenir un gain de performance intéressant!

Cependant, comme d'autres l'ont souligné, rien dans cela va changer la complexité de votre code. Il restera toujours O(number of rows * number of cells), ce qui signifie que lorsque vous doublez la quantité de données, vous devez vous attendre à doubler le temps de calcul.