قائمة التكرار يأخذ الكثير من الوقت؟
سؤال
لدي قائمة (من الفصل). وجود 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
المحلول
من الصعب معرفة من الكود الذي تقوم به ما تفعله ، ولكن استخدام PropertyInfo هو دليل كبير جدًا على وجود بعض الانعكاسات (ذلك واستخدام GetValue).
علاوة على ذلك ، كل شيء يتم تسليمه من خلال القيمة التي هي من نوع كائن ، وهو نوع من ما يعادل .NET لمتغير VB6 القديم.
كل ما يكلفك Typecasting.
بدلاً من ذلك ، إذا كانت هناك طريقة للحصول على قائمة الدعائم في نوع من الكائنات المكتوبة بالفعل ، بحيث يمكنك تجنب جميع ISINT ، ISDATE ، إلخ ، المكالمات ، ومكالمات getValue ، يجب أن ترى زيادة لائقة في السرعة.
هذا هو المكان الذي سأنظر فيه أولاً.
نصائح أخرى
بخلاف "التكرار على بيانات أقل" ، لا أرى حلًا مباشرًا هنا. ما مقدار العمل الذي يجب عليك القيام به مثل (السجلات*fields_per_record) ؛ أنت عالق في المرور عبر الحلقة الداخلية ~ 162،000 مرة بالنظر إلى الأرقام التي قدمتها.
شراء معالج أسرع وأضف المزيد من الذاكرة.
الأشياء الأولى أولاً ، الكود الخاص بك هو فوضى. المسافة البادئة غير واضحة و iRow
يتم زيادة ما إذا كان في حلقة عندما داخل أ For Each
على التقارير. أظن أنك تكرر نفس البيانات مرارًا وتكرارًا.
ثانياً ، في كل صف ، تختبر مرارًا وتكرارًا أنواع الأعمدة. الآن ، منذ ذلك الحين props
لم يتم تعيينه داخل القائمة ، سيكون التحسين الكبير هو إزالته IsInt
و IsDate
اختبارات من خلال التخزين المؤقت بطريقة ما ما هي الأنواع التي لديهم.
أيضًا ، إذا تمكنت من تخصيص جميع الخلايا لصف واحد قبل أن تحلق على الخصائص ، فقد تحصل على مكسب جيد في الأداء!
ومع ذلك ، كما أشار الآخرون ، ولا شيء في هذا سوف يغير تعقيد الكود الخاص بك. سيبقى دائما O(number of rows * number of cells)
, بمعنى أنك مضاعفة كمية البيانات ، يجب أن تتوقع مضاعفة وقت الحساب.