Сравнение производительности цикла данных DataTable - PullRequest
9 голосов
/ 07 августа 2008

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

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

4 голосов
/ 07 августа 2008

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

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

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

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

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

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


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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...