سؤال

من الذي لديه أفضل أداء ؟

لقد رأيت الطريقة الثانية نفذت في جافا سكريبت مع ضخمة المكاسب الأداء ، ومع ذلك ، لم أتمكن من قياس أي مكسب في C# و أتساءل عما إذا كان المترجم بالفعل الطريقة 2 حتى عندما كتب مثل الطريقة 1.

النظرية وراء الأسلوب 2 هو أن القانون لا يجب أن يكون الوصول إلى DataTable.الصفوف.الاعتماد على كل التكرار ، فإنه يمكن الوصول بسيط int c.

الأسلوب 1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

الطريقة 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}
هل كانت مفيدة؟

المحلول

لا, لا يمكن أن تفعل ذلك لأنه ليس هناك أي وسيلة للتعبير عن ثابتة على مر الزمن للحصول على قيمة.

إذا كان المترجم ينبغي أن تكون قادرة على القيام بذلك ، يجب أن يكون هناك ضمان من رمز إرجاع القيمة القيمة غير ثابت ، ومدة الحلقة لن تتغير.

لكن, في هذه الحالة, أنت حر في إضافة صفوف جديدة إلى جدول البيانات كجزء من حلقة الخاص بك ، وبالتالي فإنه متروك لكم لجعل هذا الضمان في الطريقة التي كنت قد فعلت ذلك.

لذا وباختصار ، فإن المترجم لن تفعل ذلك الأمثل إذا كان نهاية مؤشر أي شيء آخر غير متغير.

في حالة متغير ، حيث المترجم يمكن أن ننظر فقط في حلقة رمز ونرى أن هذا المتغير هو لم يتغير ، فإنه قد فعل ذلك تحميل قيمة في سجل خاص قبل بدء الحلقة ، ولكن أي كسب الأداء من الأرجح أن لا يذكر إلا حلقة الخاص بك الجسم فارغة.

الخلاصة:إذا كنت تعرف أو هو على استعداد لقبول هذا نهاية حلقة مؤشر ثابت طوال مدة الحلقة وضعه في متغير.


تحرير: إعادة قراءة رسالتك ، نعم ، قد نرى يذكر المكاسب الأداء الخاص بك حالتين لأن غضب يحسن رمز.غضب يمكن تحسين الخاص بك في نهاية قراءة مؤشر إلى إمكانية الوصول المباشر إلى متغير داخل جدول البيانات الذي يحتوي على عدد الصفوف و ذاكرة القراءة ليست مكلفة على أي حال.إذا, من ناحية أخرى, قراءة تلك الخاصية كانت مكلفة جدا عملية ، سترى أكثر ملحوظ الفرق.

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