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

При попытке установить значение по умолчанию как ТЕПЕРЬ (), я не думаю поддержки MySQL это. В MySQL Вы не можете использовать функцию или выражение как значение по умолчанию ни для какого типа столбца, за исключением столбца Типа данных timestamp, для которого можно определить CURRENT_TIMESTAMP как значение по умолчанию.

5
задан Rohit Raghuvansi 16 July 2009 в 10:56
поделиться

5 ответов

Как заметил Мердад, доступ к свойству Lines занимает много времени. Здесь нужно быть осторожным - вы обращаетесь к нему дважды на каждой итерации в данный момент:

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

Даже если вы удалите доступ в теле цикла следующим образом:

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

вы по-прежнему обращается к строкам на каждой итерации, чтобы проверить, закончили ли вы!

Если вы не хотите foreach , вы можете просто получить ] Строки один раз:

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

Лично я предпочитаю foreach , если вам действительно не нужен индекс :) ​​

13
ответ дан 18 December 2019 в 06:12
поделиться

Я думаю, что свойство Lines пересчитывается каждый раз, когда вы хотите получить к нему доступ. Следовательно, метод foreach выполняет вычисление только один раз, в то время как каждый раз, когда ваша ссылка Lines [i] выполняет переоценку всего этого. Попробуйте кэшировать результат свойства Lines и снова проверьте:

String s = String.Empty;
var lines = richtextbox.Lines;
for(int i = 0; i < lines.Length; i++)
{
    s = lines[i];
}

Кстати, ваш вопрос подразумевает неявное предположение, что foreach всегда медленнее, чем для . Это не всегда так.

10
ответ дан 18 December 2019 в 06:12
поделиться

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

Это должно заставить первый случай выполняться за время O (n ^ 2), а второй - за O (n).

3
ответ дан 18 December 2019 в 06:12
поделиться

Может быть, каждая строка копируется в новую строковую переменную (str) в каждом цикле? Я ошибаюсь, но вы, вероятно, могли бы проверить теорию с помощью этого кода

String s = String.Empty;
for (int i = 0; i < richTextBox.Lines.Length; i++)
{
    string str = richTextBox.Lines[i];
    s = str;
}
0
ответ дан 18 December 2019 в 06:12
поделиться

.NET Reflector очень полезен, чтобы определить , почему вы видите производительность, которой не ожидаете.

Попробуйте взглянуть на Строки получают аксессор, чтобы видеть, что он на самом деле делает каждый раз, когда вы к нему обращаетесь.

0
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: