Производительность доступа к полям dataSet с использованием Имен полей вместо индексов - PullRequest
8 голосов
/ 27 апреля 2011

Производительность незначительна?

Например,

myQuery.FieldbyName("MyField").AsString;
myQuery.Fields[0].AsString;

Случаи: таблица с приличным количеством полей, скажем> 50 полей

Доступ к большим наборам результатов, скажем> 100 000 строк

Означает ли польза от читаемости имен полей снижение производительности?

Ответы [ 3 ]

6 голосов
/ 27 апреля 2011

Вот интересный пост Франсуа Гайяра о проблемах производительности FieldByName .

4 голосов
/ 27 апреля 2011

Производительность не может быть незначительной, в зависимости от того, как часто вы обращаетесь к полю по имени.Если вы используете его для каждого поля и каждой строки, вы можете заметить снижение производительности (см., Например, http://www.delphifeeds.com/go/s/74559).. Чтобы обеспечить удобочитаемость и повысить производительность, вы можете:

  1. Использовать ['FieldName'] или FieldByName () синтаксис только один раз и сохраняют ссылку на поле в переменной.
  2. Используйте "static" объявление постоянного поля, щелкнув правой кнопкой мышинабор данных, выберите Редактор полей и добавьте необходимые поля. Он объявит правильного потомка TField и позволит вам присвоить имя.

Также вызовы AsXXXXX могут быть медленнее, чем при использовании собственного свойства Value потомка TField.

1 голос
/ 27 апреля 2011

Я обнаружил, что FieldByName заметно медленнее.

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

ADODataSet.CommandText := 'select * from [TABLE] where 1 = 0'; //table layout
ADODataSet.Open;
ADODataSet.GetFieldNames(List);
varMyField := List.IndexOf('MyField');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...