Сведения о вопросе

ЧОВИД

16:03, 1st July, 2020

Теги

c#   performance   loops    

DataTable Сравнение Производительности Цикла

Просмотров: 448   Ответов: 1

Какой из следующих вариантов обладает наилучшей производительностью?

Я видел метод два, реализованный в JavaScript с огромным увеличением производительности, однако я не смог измерить какой-либо прирост в C# и задавался вопросом, делает ли компилятор уже Метод 2, даже если он написан как метод 1.

Теория, лежащая в основе метода 2, заключается в том, что коду не нужно обращаться к DataTable.Rows.Count на каждой итерации, он может просто получить доступ к int c.

Способ 1

for (int i = 0; i < DataTable.Rows.Count; i++) {
    // Do Something
}

Способ 2

for (int i = 0, c = DataTable.Rows.Count; i < c; i++) {
    // Do Something
}



  Сведения об ответе

lool

18:03, 1st July, 2020

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

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

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

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

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

Вывод: Если вы знаете или готовы принять, что индекс конечного цикла постоянен в течение всего цикла, поместите его в переменную.


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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться