2013-03-17 2 views
-3

В этой статье мы обсудили анализ производительности for loop и foreach. Какой из них дает лучшую производительность - for или foreach?Анализ эффективности для цикла и foreach

Вот два простых метода:

public static void TestFor() 
{ 

    Stopwatch stopwatch = Stopwatch.StartNew(); 
    int[] myInterger = new int[1]; 
    int total = 0; 
    for (int i = 0; i < myInterger.Length; i++) 
    { 
     total += myInterger[i]; 
    } 
    stopwatch.Stop(); 
    Console.WriteLine("for loop Time Elapsed={0}", stopwatch.Elapsed); 
} 
public static void TestForeach() 
{ 
    Stopwatch stopwatchForeach = Stopwatch.StartNew(); 
    int[] myInterger1 = new int[1]; 
    int totall = 0; 
    foreach (int i in myInterger1) 
    { 
     totall += i; 
    } 

    stopwatchForeach.Stop(); 
    Console.WriteLine("foreach loop Time Elapsed={0}", stopwatchForeach.Elapsed); 
} 

Тогда я побежал код выше результат был Еогеасп Время цикла Прошедшее = 00: 00: 00,0000003, цикл Время, прошедшее с начала = 00: 00: 00,0001462. Я думаю, нам нужен высокопроизводительный код. Мы использовали бы foreach

+0

В цикле for вы должны хранить 'myInteger.Length' вне оператора' for' для лучшей производительности. В противном случае ему придется запрашивать длину массива для каждой итерации. – ryan

+0

Вы вызывали 'GC.Collect' между вызовами' TestFor' и 'TestForeach'? Я думаю, что первый тест может повлиять на результаты второго из-за сбора мусора. – user20140268

+0

Любой тест производительности, который не запускается, счетчик итераций, который позволяет измерять время до нескольких секунд, если не минуты, является подозрительным. Тебя просто слишком много, возможно, путают, что может добавить несколько ложных десятых долей секунды, полагая, что любой тест производительности работает менее чем на 5 секунд в целом. –

ответ

1

Мое решение не было основано на некоторой простой петле производительности, как это. Я предполагаю, что вы часто используете циклы/большие наборы данных. Вы не заметите разницы, пока не начнете говорить об итерациях в сотнях тысяч (как минимум).

1) Если вы пишете приложения с потенциальными фреймами с памятью (XBOX, Windows Phone, Silverlight). Я бы использовал цикл for, поскольку foreach может оставить легкий «мусор», который можно оставить для сбора. Когда я занимался разработкой XBOX несколько лет назад для игр, общий трюк состоял в том, чтобы инициализировать фиксированный массив элементов, отображаемых на экране, используя цикл for и хранить это в памяти, а затем вам не нужно беспокоиться о настройках сбора мусора/памяти/сбор мусора и т. д. Это может быть проблемой, если у вас есть такой цикл, который называется 60+ раз/сек (т.е. игры)

2) Если у вас очень большой набор, который вы выполняете, и производительность - это ваш ключевой драйвер решения (помните, что эти цифры не будут заметны, если они не являются большими), тогда вы можете посмотреть на распараллеливание своего кода. Разница тогда может быть не для vs foreach, а для Parallel.For против Parallel.Foreach vs PLINQ (метод AsParallel()). У вас есть разные темы, чтобы решить эту проблему.

Редактирование: В производственном приложении вы, скорее всего, будете иметь какую-то логику в своих циклах, которая займет >>> время для повторения элемента. Как только вы добавите это в драйвер производительности микширования, обычно переключается на фактическую логику, не оптимизируя итерации (которые компилятор делает довольно хорошо).

+0

сотни тысяч итераций вряд ли будут достаточно накладными, чтобы быть заметными. Вероятно, вам нужно будет повторять десятки или сотни миллионов, если не миллиарды, раз, чтобы действительно заметить разницу. – Servy

Смежные вопросы