مقایسه بین حلقه های تکرار (Lambda ForEach و for و foreach)
شنبه 1 تیر 1392مقایسه بین حلقه های تکرار (Lambda ForEach و for و foreach) <br/> به حلقههای تکرار زیر دقت کنید. <br/> #1 حلقه for با استفاده از متغیر Count لیست
به حلقههای تکرار زیر دقت کنید.
#1 حلقه for با استفاده از متغیر Count لیست
var ListOfNumber = new List<int>() { 100, 200, 300 , 400 , 500 }; for ( int i = 0 ; i < ListOfNumber.Count ; i++ ) { Console.WriteLine( ListOfNumber[i] ); }
#2حلقه for با استفاده از متغیر یا مقدار صریح
#3 foreach ساده که احتمالا خیلی از شماها از اون استفاده میکنید.
#4 Lambda ForEach که مورد علاقه بعضیها از جمله خود من است.
var ListOfNumber = new List<int>() { 100, 200, 300 , 400 , 500 }; for ( int i = 0 ; i < 5 ; i++ ) { Console.WriteLine( ListOfNumber[i] ); }
var ListOfNumber = new List<int>() { 100, 200, 300 , 400 , 500 }; foreach ( var number in ListOfNumber ) { Console.WriteLine( number ); }
var ListOfNumber = new List<int>() { 100, 200, 300 , 400 , 500 }; ListOfNumber.ForEach( number => { Console.WriteLine( number ); });
به نظر شما حلقههای بالا از نظر کارایی چه تفاوتی با هم دارند؟
تمام حلقههای بالا یک خروجی رو چاپ خواهند کرد ولی اگر فکر میکنید که هیچ تفاوتی ندارند سخت در اشتباه هستید.
هر 4 حلقه تکرار بالا رو در 21 حالت مختلف با شریط یکسان در یک سیستم تست کردیم و نتایج زیر حاصل شد.(منظور از نتایج مدت زمان اجرای هر حلقه است)
بررسی نتایج :
من همون حلقه بالا رو به صورت آرایه پیاده سازی کردم و برای اجرای حلقه از دستور Array.ForEach که عملکردی مشابه با List.ForEach داره استفاده کردم که نتیجه به دست اومده نشون داد که Array.ForEach از نظر سرعت به مراتب از foreach معمولی کندتر عمل میکنه.دلیلش هم اینه که کامپایلر هنگام کار با آرایهها و اجرای اونها به صورت حلقه، کد IL خاصی رو تولید میکنه که مخصوص کار با آرایه هاست و سرعت اون به مراتب از سرعت کد IL تولید شده برای IEnumeratorها پایین تره.
تمام حلقههای بالا یک خروجی رو چاپ خواهند کرد ولی اگر فکر میکنید که هیچ تفاوتی ندارند سخت در اشتباه هستید.
هر 4 حلقه تکرار بالا رو در 21 حالت مختلف با شریط یکسان در یک سیستم تست کردیم و نتایج زیر حاصل شد.(منظور از نتایج مدت زمان اجرای هر حلقه است)
تعداد تکرار | #1 for با استفاده از متغیر Count لیست | #2 for-استفاده از متغیر | #3 foreach | #4 Lambda ForEach |
1000 | 0.000008 | 0.000007 | 0.000014 | 0.000012 |
2000 | 0.000014 | 0.000013 | 0.000026 | 0.000022 |
3000 | 0.000019 | 0.000016 | 0.000036 | 0.000028 |
4000 | 0.000024 | 0.000022 | 0.000047 | 0.000035 |
5000 | 0.000029 | 0.000025 | 0.000058 | 0.000043 |
10,000 | 0.000059 | 0.000047 | 0.000117 | 0.000081 |
20,000 | 0.000128 | 0.000093 | 0.000225 | 0.000161 |
30,000 | 0.000157 | 0.000141 | 0.000336 | 0.000233 |
40,000 | 0.000221 | 0.000180 | 0.000442 | 0.000310 |
50,000 | 0.000263 | 0.000236 | 0.000553 | 0.000307 |
100,000 | 0.000530 | 0.000443 | 0.001103 | 0.000773 |
200,000 | 0.001070 | 0.000879 | 0.002194 | 0.001531 |
300,000 | 0.001641 | 0.001345 | 0.003281 | 0.002308 |
400,000 | 0.002233 | 0.001783 | 0.004388 | 0.003083 |
500,000 | 0.002615 | 0.002244 | 0.005521 | 0.003873 |
1,000,000 | 0.005303 | 0.004520 | 0.011072 | 0.007767 |
2,000,000 | 0.010543 | 0.009074 | 0.022127 | 0.015536 |
3,000,000 | 0.015738 | 0.013569 | 0.033186 | 0.023268 |
4000,000 | 0.021039 | 0.018113 | 0.044335 | 0.031188 |
5000,000 | 0.026280 | 0.022593 | 0.055521 | 0.038793 |
10,000,000 | 0.052528 | 0.046090 | 0.111517 | 0.078482 |
بررسی نتایج :
- سریعترین حلقه تکرار حلقه for با استفاده از متغیر معمولی به عنوان تعداد تکرار حلقه است.
- رتبه دوم برای حلقه for همراه با استفاده از خاصیت Count لیست مورد نظر بوده است. دلیلش هم اینه که سرعت دستیابی کامپایلر به متغیرهای معمولی حتی تا 3برابر سریعتر از دسترسی به متد get خاصیت هاست.
- مهمترین نکته این است که Lambda ForEach عمکردی بسیار بهتری نسبت به foreach معمولی داره.
پس هر گاه قصد اجرای حلقه ForEach رو برای لیست دارید و سرعت اجرا هم براتون اهمیت داره بهتره که از Lambda ForEach استفاده کنید. حالا به کد زیر دقت کنید:
int[] arrayOfNumbers = new int[] {100 , 200 , 300 , 400 , 500 }; Array.ForEach<int>( arrayOfNumbers, ( int counter ) => { Console.WriteLine( counter ); } );
- C#.net
- 2k بازدید
- 3 تشکر