سؤال

هل سيكون هناك فرق أداء ضخم بين:

if (this.chkSelectAll.Checked)
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
        this.listBoxColumns.SetSelected(i, true);
else
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
        this.listBoxColumns.SetSelected(i, false);

ضد.

for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
    this.listBoxColumns.SetSelected(i, this.chkSelectAll.Checked);

أي واحد ينصح. ترميز موجز مقابل مكاسب الأداء؟

هل كانت مفيدة؟

المحلول

لا أتوقع أن أرى الكثير من فرق الأداء، وأذهب بالتأكيد مع الأخير لأنه أكثر قابلية للقراءة. (كنت أضع الأقواس حولها.

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

bool checked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
{
    this.listBoxColumns.SetSelected(i, checked);
}

كما أبدا، اكتب الرمز الأكثر قراءة أولا، وقياس / ملف تعريف أي اختلافات أداء قبل الانحناء التصميم / الرمز من الشكل من أجل الأداء.

نصائح أخرى

أفترض أن فرق الأداء سيكون بالكاد ملحوظ. ولكن إليك الاختلاف الذي يكون فعالا وكفاءة للغاية

bool isChecked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++) {
    this.listBoxColumns.SetSelected(i, isChecked);
}

إذا كنت بعد بعض التحسينات الحقيقية، فسوف ترغب أيضا في الانتباه إلى ما إذا كانت النفقات العامة للوصول إلى "this.listboxcolumns" مرتين على كل تكرار موجود في المقام الأول وهو يستحق الاهتمام به. هذا هو ما هو التنميط ل.

لديك فحص منطقي إضافي في المثال الأول. لكن بعد أن قال ذلك، لا أستطيع أن أتخيل أن اختلاف الأداء سيكون أي شيء آخر غير مهم. هل حاولت قياس هذا في سيناريو الخاص بك؟

المثال الثاني هو الأفضل لأنك لا تكرر رمز الحلقة.

لا أستطيع أن أرى هناك فرق كبير في الأداء بين الاثنين. إن الطريقة لتأكيد أنها ستكون إنشاء معيارا ووقت الخوارزميات المختلفة لأكثر من 1000 ثانية من التكرارات.

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

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

أي فرق الأداء سيكون ضئيلا.

يجب أن يكون مصدر قلقك الأساسي لقراءة التعليمات البرمجية والصيانة.

التفايئات الصغيرة مثل هذه هي في كثير من الأحيان غير موجودة، في غير محلها. دائما الملف الشخصي قبل أن يهتم بالأداء.

من المرجح أن تكون ضئيلة. والأهم من ذلك، ومع ذلك، أشعر بالحاجة إلى اقتباس ما يلي:

"التحسين المبكر هو أصل كل الشرور"

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

لماذا لا تستخدم system.diagnostics.stopwatch ومقارنة اثنين بنفسك؟ ومع ذلك، لا أصدق أنه سيكون هناك أي فرق أداء حقيقي. المثال الأول قد يكون أسرع لأنك تصل فقط إلى CHKSELECTALL.Checked مرة واحدة. كلاهما قابل للقراءة بسهولة رغم ذلك.

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