Сравнение производительности цикла данных 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
}
7.08.2008 10:01:04
1 ОТВЕТ
РЕШЕНИЕ

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

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

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

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

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

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


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

6
7.08.2008 10:09:58