Разница в производительности при циклировании

StackOverflow https://stackoverflow.com/questions/934265

  •  06-09-2019
  •  | 
  •  

Вопрос

Будет ли огромная разница в производительности между:

if (this.chkSelectAll.Checked)
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
        this.listBoxColumns.SetSelected(i, true);
else
    for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
        this.listBoxColumns.SetSelected(i, false);

против.

for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
    this.listBoxColumns.SetSelected(i, this.chkSelectAll.Checked);

Какой из них является целесообразным.Краткое кодирование противприрост производительности?

Это было полезно?

Решение

Я бы не ожидал увидеть большой разницы в производительности, и я бы, конечно, выбрал последнее, поскольку оно более читабельно.(Хотя я бы обхватил его фигурными скобками.)

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

bool checked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++)
{
    this.listBoxColumns.SetSelected(i, checked);
}

Как всегда, сначала напишите наиболее читаемый код и измерьте / профилируйте любые различия в производительности, прежде чем искажать свой дизайн / код ради повышения производительности.

Другие советы

Я полагаю, что разница в производительности будет едва заметной.Однако вот вариант, который является одновременно эффективным и хорошо читаемым:

bool isChecked = this.chkSelectAll.Checked;
for (int i = 0; i < this.listBoxColumns.Items.Count; i++) {
    this.listBoxColumns.SetSelected(i, isChecked);
}

Если вам нужна какая-то реальная оптимизация, вы также захотите обратить внимание на то, присутствуют ли накладные расходы на доступ к "this.listBoxColumns" дважды на каждой итерации в первую очередь и на что стоит обратить внимание.Вот для чего существует профилирование.

В первом примере у вас есть дополнительная логическая проверка.Но, сказав это, я не могу себе представить, что разница в производительности будет чем-то иным, кроме незначительной.Вы пробовали измерить это в вашем конкретном сценарии ?

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

Я не вижу существенной разницы в производительности между ними.Способ подтвердить это - настроить бенчмарк и рассчитать время для различных алгоритмов в течение 1000 итераций.

Однако, поскольку это код пользовательского интерфейса, любое увеличение производительности довольно бессмысленно, поскольку вы будете ждать, пока пользователь прочтет диалоговое окно и решит, что делать дальше.

Лично я бы каждый раз выбирал второй подход.У вас есть только один цикл для обслуживания, и код становится понятнее.

Любая разница в производительности будет незначительной.

Вашей главной заботой должна быть читабельность кода и ремонтопригодность.

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

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

"Преждевременная оптимизация - корень всего зла"

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top