سؤال

لدي قائمة (من الفصل). وجود 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), بمعنى أنك مضاعفة كمية البيانات ، يجب أن تتوقع مضاعفة وقت الحساب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top