В .NET какой цикл выполняется быстрее, «для» или «foreach»? - PullRequest
311 голосов
/ 13 декабря 2008

В C # / VB.NET / .NET цикл работает быстрее, for или foreach?

С тех пор, как я прочитал, что цикл for работает быстрее, чем цикл foreach давно Я предположил, что это верно для всех коллекций, общих коллекций, всех массивов и т. Д.

Я искал Google и нашел несколько статей, но большинство из них неубедительны (см. Комментарии к статьям) и имеют открытый конец.

Что было бы идеально, так это перечислить каждый сценарий и найти лучшее решение для него.

Например (просто пример того, как это должно быть):

  1. для итерации массива 1000+ строки - for лучше, чем foreach
  2. для итерации по IList (не универсальным) строкам - foreach лучше чем for

В Интернете найдено несколько ссылок на одно и то же:

  1. Оригинальная великая старая статья Эммануэля Шанцера
  2. CodeProject FOREACH Vs. ДЛЯ
  3. Блог - foreach или foreach, вот в чем вопрос
  4. Форум ASP.NET - NET 1.1 C # for против foreach

[Изменить]

Помимо аспекта читабельности, меня действительно интересуют факты и цифры. Есть приложения, в которых важна последняя миля оптимизации производительности.

Ответы [ 40 ]

1 голос
/ 11 января 2016

Я упомянул эту информацию в зависимости от скорости сбора для for и foreach.

List -For Loop немного быстрее, чем цикл Foreach

ArrayList - For Loop примерно в 2 раза быстрее, чем Foreach Loop.

Array - Оба имеют одинаковую скорость. Но цикл по каждому элементу кажется немного быстрее.

1 голос
/ 23 сентября 2016

Я столкнулся с случаем, когда foreach ПУТЬ быстрее, чем For

почему foreach работает быстрее цикла for при чтении строк richtextbox

У меня был случай, похожий на ФП в этом вопросе.

Текстовое окно, читающее о 72K строках, и я обращался к свойству Lines (на самом деле это метод получения). (И, очевидно, часто в winforms есть методы получения, которые не являются O (1). Я предполагаю, что это O (n), поэтому, чем больше текстовое поле, тем больше времени требуется, чтобы получить значение из этого «свойства». цикл, который у меня был в качестве OP, имел for(int i=0;i<textBox1.lines.length;i++) str=textBox1.Lines[i], и он был действительно довольно медленным, так как он читал все текстовое поле каждый раз, когда читал строку, плюс он читал все текстовое поле каждый раз, когда проверял условие.

Джон Скит показывает, что вы можете получить доступ к свойству Lines только один раз (даже не один раз за итерацию, а только один раз). Вместо того, чтобы дважды на каждой итерации (что составляет тонну раз). Do string [] strarrlines = textBox1.Lines; и перебрать страрлинии.

Но, конечно, цикл for в довольно интуитивно понятной форме и доступ к свойству Lines очень неэффективен

for (int i = 0; i < richTextBox.Lines.Length; i++)
{
    s = richTextBox.Lines[i];
}

для текстового поля или расширенного текстового поля, это очень медленно.

Оператор тестирования, тестируя этот цикл в расширенном текстовом поле, обнаружил, что «с циклом 15000 lines.for потребовалось 8 минут, чтобы просто зациклиться до 15000 строк, тогда как foreach потребовал доли секунды для его перечисления».

OP в этой ссылке обнаружил, что этот foreach гораздо более эффективен, чем его (тот же OP) для цикла, упомянутого выше. Как и я.

   String s=String.Empty;
   foreach(string str in txtText.Lines)
    {
       s=str;
    }
1 голос
/ 13 декабря 2008

Я проверял это некоторое время назад, в результате цикл for намного быстрее, чем цикл foreach. Причина проста: цикл foreach должен сначала создать экземпляр IEnumerator для коллекции.

1 голос
/ 10 августа 2011

В моем проекте в Windows Mobile я использовал цикл for для коллекции элементов управления. Потребовалось 100 мс для 20 контролей! Петля foreach используется только 4 мс. Это была проблема с производительностью ...

0 голосов
/ 22 декабря 2009

По крайней мере, я не видел, чтобы кто-то из моих коллег или старших сотрудников говорил, что это просто смешно, учитывая тот факт, что между for и foreach нет значительной разницы в скорости. То же самое относится, если он просит использовать его во всех случаях!

0 голосов
/ 08 ноября 2015

Бен Уотсон, автор книги «Написание высокопроизводительного кода .NET»:

"Будут ли эти оптимизации иметь значение для вашей программы? Только если ваша программа привязан к процессору, и итерация коллекции является основной частью вашего обработка. Как вы увидите, есть способы, которыми вы можете навредить производительность, если вы не осторожны, но это имеет значение, только если это было Значительная часть вашей программы для начала. Моя философия такова: большинство людей никогда не должны знать это, но если вы знаете, то понимание каждый слой системы важен, так что вы можете сделать разумный выбор ".

Самое исчерпывающее объяснение можно найти здесь: http://www.codeproject.com/Articles/844781/Digging-Into-NET-Loop-Performance-Bounds-checking

0 голосов
/ 27 июня 2014

Мне нужно было выполнить синтаксический анализ некоторых больших данных, используя три вложенных цикла (на List<MyCustomType>). Я подумал, что, используя пост Роба Фонсека-Энсора выше, было бы интересно сравнить время, используя для и foreach .

Разница была: Foreach (три foreach, вложенные как foreach {foreach {forech {}}} выполнил задание за 171.441 секунд, а для (для {for {for {}}}) это было выполнено в 158.616 секунд.

Теперь 13 секунд - это примерно 13% сокращение времени, чтобы сделать это - что несколько важно для меня. Тем не менее, foreach определенно гораздо удобнее для чтения, чем использование трех индексированных форм ...

0 голосов
/ 22 декабря 2009

Я думаю, что в большинстве случаев for незначительно быстрее, чем foreach, но это действительно упускает смысл. Одна вещь, о которой я не упомянул, заключается в том, что в сценарии, о котором вы говорите (то есть, в веб-приложении большого объема), разница в производительности между for и foreach не повлияет на производительность сайта. Вы будете ограничены временем запроса / ответа и временем БД, а не v. Foreach.

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

0 голосов
/ 18 декабря 2013

Начиная с .NET Framework 4, вы также можете использовать Parallel.For и Parallel.ForEach, как описано здесь: C # Многопоточный цикл с Parallel.For или Parallel.ForEach

0 голосов
/ 23 января 2009

Я бы предложил прочитать это для конкретного ответа. Вывод статьи заключается в том, что использование цикла for обычно лучше и быстрее, чем цикл foreach.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...