سؤال

الذي هو عادة أسرع عند القراءة/مقارنة صف معلومات من DataTable?

'assume dt as datatable'

'method 1'
dim i as int32
for i = 0 to dt.rows.count - 1
   ....
next

'method 2'
dim row as datarow
for each row in dt.rows
    ....
next

و إذا كان هناك فرق في أي ظرف من الظروف لا تدفع إلى استخدام واحد على الآخر ؟

شكرا مقدما على أي توجيه!

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

المحلول

والمترجم يوسع على كل لفترة قصيرة حلقة.

for each row in dt.rows
// expands to:
IEnumerator e = dt.rows.GetEnumerator()
while e.MoveNext()
    row = e.Current

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

نصائح أخرى

في الواقع لا فرق. على الرغم من أن تدفعه من الناحية الفنية ثمنا قليلا في طريقة foreach، للذهاب من خلال واجهة IEnumerable.

وأما الثاني سيكون له عقوبة طفيفة. ولكن كما لالظروف، I persoanlly ستستخدم دائما طريقة 2 لوضوح التعليمات البرمجية. ومع ذلك، أود أن استخدام أسلوب 1 إذا كنت من أي وقت مضى بحاجة إلى القيام بشيء مثل الوصول إلى الصف التالي / السابق في حين تحليل الصف الحالي.

حسنا, هناك فرق, منذ GetEnumerator و MoveNext التي تسمى في foreach-الحلقة الظاهري (الدعوة يتطلب الذهاب من خلال مؤشر) وبالتالي لا يمكن أن يكون المضمنة.هذه النفقات في الواقع صغيرة ، إلا إذا كنت تفعل الكثير من الحلقات.

في بعض الحالات على الرغم من أن المترجم محل foreach مع على-حلقة (أعتقد عندما بالتكرار على المصفوفات).

أنا شخصيا أفضل foreach في بلدي ASP.NET MVC رمز الوضوح ، كما قال هنا ، ولكن غالبا ما تستخدم ل-حلقة أيضا.جو دافي نشرت مؤخرا مقالة مثيرة للاهتمام حول تكلفة تعداد http://joeduffyblog.com/2008/09/21/the-cost-of-enumerating-in-net/

و @gdean232 هو الصحيح - أي ما يقرب من فرق على الإطلاق. إذا كان الأداء هو المشكلة، باستخدام وSqlDataReader بدلا ملاحظته بشكل أسرع.

وتنفيذ foreach هو في الواقع أسرع قليلا من مستوى للتنفيذ، لأن كل وصول مؤشر مجموعة يحتاج إلى حدود التحقق. ومع ذلك، منذ لغة:

for(int i =0; i < myArray.Count; ++i)
{
    // do something with myArray[i];
}

وأمر شائع، المترجم بالبحث عن أنها حالة خاصة وأنه المثلى، لذلك يصبح أسرع. ومع ذلك، فإن أي انحراف صغير من هذا الشكل (مثل كثافة العمليات ليون = MyArray.Count، ل(كثافة العمليات ط = 0؛ ط <لين، ++ ط)). لن يعترف، وسيتم استخدام رمز أبطأ

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