PDA

View Full Version : مقایسه حلقه ها در سی شارپ for vs foreach! کدام سریع ترن؟



RmeXXXXXXXXX
شنبه 08 آذر 1393, 22:17 عصر
دوستانی که اطلاع دقیق دارن ج بدن!

mrprestige
شنبه 08 آذر 1393, 22:31 عصر
سلام. مسلما حلقه for سریعتر از foreach هست . حلقه ی Foreach در واقع یک حلقه ی تک دستوریه ولی توی حلقه ی for اینطور نیست و یه حلقه ی چند دستوری هستش و از انعطاف بالاتری و همینطور سریعتر نسبت به foreach هست . امیدوارم تونسته باشم سوالت رو جواب داده باشم . موفق باشی

hsgpro
شنبه 08 آذر 1393, 22:33 عصر
تو php که foreach سریعتره.
اینم لینک آموزش برای پی اچ پی: http://barnamenevis.org/showthread.php?475727 اما تو سی شارپ نمی دونم ممکنه بازم foreach سریعتر باشه.

elec60
شنبه 08 آذر 1393, 22:40 عصر
حلقه for تا حدی سریعتر از foreach هست، چون علاوه بر متغیری که ما تعریف میکنیم، دو تا متغیر دیگه توسط کامپایلر در حافظه Stack در حالتی که foreach استفاده میشه ایجاد میشه. حلقه foreach در واقع متد GetEnumerator کالکشنی که روش کار میکنه رو صدا میزنه و توسط yield return به موقعیت قبلیش برمیگرده تا ادامه بده و اون دو تا متغیر ایجاد شده توسط کامپایلر اینجا مورد استفاده قرار می گیرن

برای درک بهتر اینکه CLR چه کاری میکنه میتونین از یه دیس اسمبلر استفاده کنین و ببینین تو Stack چه اتفاقی برای هر کدوم از حلقه ها میوفته

اگه میخوایین کلا سر در بیارین که CLR دقیقا چه غلطی میکنه پیشنهاد میکنم کتاب جفری ریشتر رو بخونین تا مثل من تازه متوجه بشین که از دات نت هیچی نمی فهمین:لبخند:

RmeXXXXXXXXX
شنبه 08 آذر 1393, 22:55 عصر
حلقه for تا حدی سریعتر از foreach هست، چون علاوه بر متغیری که ما تعریف میکنیم، دو تا متغیر دیگه توسط کامپایلر در حافظه Stack در حالتی که foreach استفاده میشه ایجاد میشه. حلقه foreach در واقع متد GetEnumerator کالکشنی که روش کار میکنه رو صدا میزنه و توسط yield return به موقعیت قبلیش برمیگرده تا ادامه بده و اون دو تا متغیر ایجاد شده توسط کامپایلر اینجا مورد استفاده قرار می گیرن

برای درک بهتر اینکه CLR چه کاری میکنه میتونین از یه دیس اسمبلر استفاده کنین و ببینین تو Stack چه اتفاقی برای هر کدوم از حلقه ها میوفته

اگه میخوایین کلا سر در بیارین که CLR دقیقا چه غلطی میکنه پیشنهاد میکنم کتاب جفری ریشتر رو بخونین تا مثل من تازه متوجه بشین که از دات نت هیچی نمی فهمین:لبخند:


***************
خوندمش! همه این مطالب رو هم مسلطم! ولی بازم نمیتونم ثابتش کنم! چیزی ک مسلمه اینه هیچ وقت foreach از for سریع تر نیست! ولی کندتر!؟

rahnema1
یک شنبه 09 آذر 1393, 07:10 صبح
البته بستگی به این داره که چه چیزی را بخواهیم پیمایش کنیم
Listقبل از ویرایش پست تصور می کردم List همون Linkedlist هست که متوجه شدم List چیزی نیست جز یک آرایه داینامیک و سرعت دسترسی با اندکس تفاوت چندانی با آرایه معمولی نمی کنه
اما ممکنه یک collection اختصاصی مثل linkedlist که دسترسی با اندکس در اون مهیا باشه ایجاد کنیم در این صورت سرعت foreach از for بیشتر میشه

hsgpro
یک شنبه 09 آذر 1393, 08:22 صبح
دوستان طبق لینک زیر در دات نت 4 foreach سریعتره:

http://www.dotnetperls.com/for-foreach


New results. Now, the for loop is slightly slower than the foreach loop. This is because the local variable that stores the value of the element in the array is faster to access than an element in the array.

elec60
یک شنبه 09 آذر 1393, 09:07 صبح
دوستان طبق لینک زیر در دات نت 4 foreach سریعتره:

http://www.dotnetperls.com/for-foreach

تو همین سایت مثالهایی هم زده که for سریعتر بوده. بستگی به collection ای داره که پیمایش میشه.

behnamgholipoor
یک شنبه 09 آذر 1393, 11:39 صبح
In .NET, which loop runs faster, 'for' or 'foreach'? (http://stackoverflow.com/questions/365615/in-net-which-loop-runs-faster-for-or-foreach)

For example (just an example of how it should be):



[*=left]for iterating an array of 1000+ strings - for is better than foreach
[*=left]for iterating over IList (non generic) strings - foreach is better than for







using System;
using System.Diagnostics;
using System.Linq;

class Test
{
const int Size = 1000000;
const int Iterations = 10000;

static void Main()
{
double[] data = new double[Size];
Random rng = new Random();
for (int i=0; i < data.Length; i++)
{
data[i] = rng.NextDouble();
}

double correctSum = data.Sum();

Stopwatch sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
double sum = 0;
for (int j=0; j < data.Length; j++)
{
sum += data[j];
}
if (Math.Abs(sum-correctSum) > 0.1)
{
Console.WriteLine("Summation failed");
return;
}
}
sw.Stop();
Console.WriteLine("For loop: {0}", sw.ElapsedMilliseconds);

sw = Stopwatch.StartNew();
for (int i=0; i < Iterations; i++)
{
double sum = 0;
foreach (double d in data)
{
sum += d;
}
if (Math.Abs(sum-correctSum) > 0.1)
{
Console.WriteLine("Summation failed");
return;
}
}
sw.Stop();
Console.WriteLine("Foreach loop: {0}", sw.ElapsedMilliseconds);
}
}


Results:


For loop:16638
Foreach loop:16529

danialafshari
یک شنبه 09 آذر 1393, 13:38 عصر
http://www.codeproject.com/Tips/531893/For-Vs-Foreach-Benchmark