- PVSM.RU - https://www.pvsm.ru -
В этой статье я проведу сравнительный анализ DataSet'ов, которые держат данные в оперативной памяти.
Delphi | 10.2 Tokyo Starter |
Операционная система | Windows 7 SP1 Ultimate x64 |
Процессор | Intel Core i5 |
ОЗУ | 8 Гб |
DataSet'ы будут тестироваться на данных, полученных из базы данных Firebird. Для сравнительного анализа я создал в базе данных 100000 записей с различными типами данных:
• целые числа;
• вещественные числа;
• даты;
• строки;
• изображения.
DataSet | LoadFromDataSet | Ручная | Среднее |
---|---|---|---|
TJvMemoryData | 7,7846 сек | 5,7500 сек | 6,7673 сек |
TMemTableEh | 4,5114 сек | 7,2978 сек | 5,9046 сек |
TdxMemData | 6,3804 сек | 6,5082 сек | 6,4443 сек |
TkbmMemTable | 5,4474 сек | 6,0562 сек | 5,7518 сек |
Загрузки для каждого DataSet'a производились по 5 раз, из полученных значений подсчитвывалось среднее арифметическое. Среднее значение — это среднее арифметическое значения загрузки при помощи метода LoadFromDataSet и значения ручной загрузки.
Результаты:
TMemTableEh — самая быстрая загрузка данных при помощи метода LoadFromDataSet
TJvMemoryData — самая быстрая ручная загрузка данных
TkbmMemTable — самая быстрая средняя загрузка данных
var
start_time, end_time, total_time: double;
start_time := GetTickCount;
...
end_time := GetTickCount;
total_time := (end_time - start_time) / 1000;
//TJvMemoryData
//function LoadFromDataSet(Source: TDataSet; RecordCount: Integer; Mode: TLoadMode; DisableAllControls: Boolean = True): Integer;
JvMemoryData.LoadFromDataSet(FIBDataSet, -1, lmCopy);
//TMemTableEh
//function LoadFromDataSet(Source: TDataSet; RecordCount: Integer; Mode: TLoadMode; UseCachedUpdates: Boolean): Integer;
MemTableEh.LoadFromDataSet(FIBDataSet, -1, lmCopy, true);
//TdxMemData
//procedure LoadFromDataSet(DataSet : TDataSet);
dxMemData.LoadFromDataSet(FIBDataSet);
//TkbmMemTable
//procedure TkbmCustomMemTable.LoadFromDataSet(Source:TDataSet; CopyOptions:TkbmMemTableCopyTableOptions; Mapping:string='');
kbmMemTable.LoadFromDataSet(FIBDataSet, [mtcpoAppend]);
while not FIBDataSet.Eof do
begin
table.Append;
table.FieldByName('ID').AsInteger := FIBDataSet.FieldByName('ID').AsInteger;
table.FieldByName('SUMM').AsFloat := FIBDataSet.FieldByName('SUMM').AsFloat;
table.FieldByName('COMMENT').AsString := FIBDataSet.FieldByName('COMMENT').AsString;
...
table.Post;
FIBDataSet.Next;
end;
table.First;
TJvMemoryData — единственный DataSet, у которого ручная загрузка данных оказалось быстрее, чем загрузка при помощи метода LoadFromDataSet.
TdxMemData — единственный DataSet, который после загрузки данных при помощи метода LoadFromDataSet не возвращает позицию в DataSet на первую запись.
DataSet | Целое число | Вещественное число | Строка | Среднее |
---|---|---|---|---|
TJvMemoryData | 0,3492 сек | 0,8330 сек | 1,9938 сек | 1,0587 сек |
TMemTableEh | 0,9014 сек | 0,8642 сек | 3,6876 сек | 1,8177 сек |
TdxMemData | 0,3616 сек | 0,3650 сек | 0,9134 сек | 0,5467 сек |
TkbmMemTable | 0,1996 сек | 0,2186 сек | 0,7550 сек | 0,3897 сек |
Сортировка для каждого DataSet'a производились по 5 раз, из полученных значений подсчитвывалось среднее арифметическое. Среднее значение — это среднее арифметическое значений сортировок.
Результаты:
TkbmMemTable — самая быстрая сортировка целых чисел
TkbmMemTable — самая быстрая сортировка вещественных чисел
TkbmMemTable — самая быстрая сортировка строк
TkbmMemTable — самая быстрая средняя сортировка
var
start_time, end_time, total_time: double;
start_time := GetTickCount;
...
end_time := GetTickCount;
total_time := (end_time - start_time) / 1000;
//TJvMemoryData
//procedure SortOnFields(const FieldNames: string = ''; CaseInsensitive: Boolean = True; Descending: Boolean = False);
JvMemoryData.SortOnFields(fields, false, false);
//TMemTableEh
//procedure SortByFields(const SortByStr: string);
MemTableEh.SortByFields(fields);
//TdxMemData
dxMemData.SortedField := fields;
//TkbmMemTable
//procedure SortOn(const FieldNames:string; Options:TkbmMemTableCompareOptions);
kbmMemTable.SortOn(fields, []);
Отмечу, что только для DataSet'а TMemTableEh при сортировке по нескольким полям можно задавать различное направление сортировки для каждого поля (по возрастанию/по убыванию).
Безоговорочным лидером оказался DataSet TkbmMemTable, но и все другие DataSet'ы показали хорошие результаты. Но воспользоваться TkbmMemTable можно только с Delphi XE2.
Конечно, на реальных данных вряд ли понадобиться загружать 100000 записей для отображения пользователю. Так же при выборе DataSet'а нужно учитывать, что на другом наборе данных (например, при отсутствии загрузки изображений или для x64-приложения) результаты скорости работы могут оказаться другими. К тому же многие DataSet'ы имеют дополнительный функционал для работы с гридом из своей библиотеки.
Компонент TMemTableEh появился в версии EhLib 4.0. Все компоненты библиотеки, включая TMemTableEh, работают начиная с Delphi 7.
Преимущества использования MemTableEh по сравнению с другими DataSet'ми следующие:
Разработчки: RxLib
Компонент TRxMemoryData появился в версии RxLib 2.60.
DataSet TRxMemoryData не участвует в сравнении, потому что в 2002 году библиотека RxLib была официально включена в состав JVCL. В JVCL есть утилита для быстрой замены всех Rx компонентов, функций и юнитов на JVCL-версии.
Почему стоит перейти на JVCL:
В отличие от RxLib, JVCL развивается. Ошибки исправляются. Регулярно выходят версии с поддержкой новых версий Delphi. JVCL компоненты поддерживают новые версии Windows и Windows-стили.
Автор: financial_decisions
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/delphi/274855
Ссылки в тексте:
[1] Официальный сайт: http://jvcl.delphi-jedi.org
[2] Официальный сайт: http://www.ehlib.com
[3] Официальный сайт: https://www.devexpress.com
[4] Официальный сайт: http://www.components4developers.com
[5] Источник: https://geektimes.ru/post/298893/?utm_campaign=298893
Нажмите здесь для печати.