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

StackOverflow https://stackoverflow.com/questions/4556

  •  08-06-2019
  •  | 
  •  

Вопрос

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

Я видел второй метод, реализованный в JavaScript, с огромным приростом производительности, однако я не смог измерить какой-либо прирост в C# и задавался вопросом, использует ли компилятор уже второй метод, даже если он написан как метод 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
}
Это было полезно?

Решение

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

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

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

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

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

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


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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top