Ehlib 8.0.15 Delphi XE7
У меня в проекте используется TFDQuery как источник информации для загрузки в TMemTableEh для последующего отображения в DBGridEh в виде дерева В выборке около 10к строк, 8 полей, половина из которых ftWideString.
При копировании информации с помощью TMemTableEh.LoadFromDataSet наблюдаю довольно сильные тормоза при повторной перезаливки данных. Удаление данных из датасета EmptyTable ~1.6 сек Повторная заливка LoadFromDataSet ~1.8 сек
Итого рефреш стоит более 3 секунд, аналогичная операция между TFDQuery и TFDMemTable стоит 0.25 сек.
Стал разбираться и выяснилось, что для определения с каким типом будут хранится данные в массиве данных в TMemoryRecordEh.FData, определяется в функции function TMTDataFieldEh.GetVarDataType: TVarType; И там прописано, что для полей с типом ftWideString данные нужно сохранять в формате varOleStr.
И теперь вопрос, зачем так сделано? Работа с типом varOleStr в 10 раз медленнее чем varUString, а данные хранятся в таком же виде. Какой профит от использования varOleStr?
Заменил у себя в функции TMTDataFieldEh.GetVarDataType: ftWideString: Result := varOleStr; на ftWideString: Result := varUString;
Время рефреша данных стало сопоставимо с временем FireDac, т.е. ~0.25 сек, что более чем в 10 раз быстрее.
Вы как хотите конечно, но у себя я так и оставлю.
|