Разница в производительности при циклировании
Вопрос
Будет ли огромная разница в производительности между:
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.Проверено один раз.Однако оба они легко читаемы.