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

Что из следующего имеет лучшую производительность?

Я видел второй метод, реализованный в 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
}

Ответов (1)

Решение

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

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

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

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

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

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


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