Скорость заполнения BufDataset и TObjectList
Добавлено: 23.03.2024 12:00:16
Есть класс на основе TObjectList и TBufDataset. Заполняю их от 0 до 25000 и получаю вот такие результаты по скорости
Математические операции порадовали и удивили, ибо при ручной отрисовке RxDBGrid мне показалось что работа с BufDataset дольше, чем тоже самое но на основе классов. А тут деление, сложение быстрее проходит. А вот заполнение буфера по скорости в два раза медленнее. На малых объемах это не заметно, но чем больше строк, тем больше разрыв.
Внимание, вопрос - а есть какие то ухищрения это исправить?
Заполнение
ObjectList Выполнено за:4,4246 сек.
BufDataset1 Выполнено за:8,5468 сек.
//Построчная математическая операция
ObjectList Выполнено за:0,8511 сек.
BufDataset1 Выполнено за:0,0460 сек.
//Математическая операция в случайном порядке
ObjectList Выполнено за:12,3523 сек.
BufDataset1 Выполнено за:0,8177 сек.
Математические операции порадовали и удивили, ибо при ручной отрисовке RxDBGrid мне показалось что работа с BufDataset дольше, чем тоже самое но на основе классов. А тут деление, сложение быстрее проходит. А вот заполнение буфера по скорости в два раза медленнее. На малых объемах это не заметно, но чем больше строк, тем больше разрыв.
Внимание, вопрос - а есть какие то ухищрения это исправить?
- Код: Выделить всё
procedure TForm1.Button1Click(Sender: TObject);
var
i:integer;
aObject:TAssiBasicObjectItem;
iCounterPerSec,C1,C2 :TLargeInteger;
begin
randomize;
QueryPerformanceFrequency(iCounterPerSec);
QueryPerformanceCounter(C1);
for i := 0 to SpinEdit1.Value - 1 do
begin
aObject:=TAssiBasicObjectItem.Create;
aObject.SetParameter('id',i);
aObject.SetParameter('name','name');
aObject.SetParameter('value',i);
Collection.add(aObject);
end;
QueryPerformanceCounter(C2);
memo1.Lines.Add('ObjectList Выполнено за:'+FormatFloat('0.0000', (C2 - C1) / iCounterPerSec) + ' сек.');
BufDataset1.DisableControls;
QueryPerformanceFrequency(iCounterPerSec);
QueryPerformanceCounter(C1);
for i := 0 to SpinEdit1.Value - 1 do
begin
BufDataset1.Append;
BufDataset1.FieldByName('id').AsInteger:=i;
BufDataset1.FieldByName('name').AsString:='name';
BufDataset1.FieldByName('value').AsInteger:=i;
BufDataset1.Post;
end;
QueryPerformanceCounter(C2);
BufDataset1.EnableControls;
memo1.Lines.Add('BufDataset1 Выполнено за:'+FormatFloat('0.0000', (C2 - C1) / iCounterPerSec) + ' сек.');
end;
- Код: Выделить всё
procedure TForm1.Button2Click(Sender: TObject);
var
e1,e2,
i:integer;
aObject:TAssiBasicObjectItem;
//test
iCounterPerSec,C1,C2 :TLargeInteger;
begin
randomize;
e1:=0;
QueryPerformanceFrequency(iCounterPerSec);
QueryPerformanceCounter(C1);
for i := 0 to Collection.Count - 1 do
begin
aObject:=Collection.Items[i];
e2:=aObject.GetParameter('value');
e1:=e1+(e2 div 2);
end;
QueryPerformanceCounter(C2);
memo1.Lines.Add('ObjectList Выполнено за:'+FormatFloat('0.0000', (C2 - C1) / iCounterPerSec) + ' сек.');
BufDataset1.DisableControls;
e1:=0;
QueryPerformanceFrequency(iCounterPerSec);
QueryPerformanceCounter(C1);
BufDataset1.First;
while not BufDataset1.EOF do
begin
e2:=BufDataset1.FieldByName('value').AsInteger;
e1:=e1+(e2 div 2);
BufDataset1.Next;
end;
QueryPerformanceCounter(C2);
BufDataset1.EnableControls;
memo1.Lines.Add('BufDataset1 Выполнено за:'+FormatFloat('0.0000', (C2 - C1) / iCounterPerSec) + ' сек.');
end;