Печать
Просмотров: 7321

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

IC128101 

И так собственно что мы имеем. 

Windows 7 x64

SQL Server 2000 (да старая версия, но она лицензионная, покупалась давненько)

Lazarus 1.6.4  - FPC 3.0.2.

Компоненты доступа.

SQLdb - стандартный набор доступа к субд, поставляется вместе  со средой разработки. 

ZeosLib - бесплатный набор компонентов для доступа к субд скачать можно тут.

UniDAC - платный набор компонентов доступа к данным. Ознакомится можно тут.

 

В качестве подопытных данных использовалась таблица с  7 колонками и  247343 строками данных.  

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

Код тестов был такой, на примере SQLdb

procedure TfrmCheck.Button1Click(Sender: TObject);
var
  PerSec: int64;
  per1: int64;
  per2: int64;
begin
  // открытие набора данных
  sqlquery1.Close;
  sqlquery1.SQL.Text := ' select * from pac_test';
  QueryPerformanceFrequency(persec);
  QueryPerformanceCounter(per1);
  sqlquery1.Open;
  QueryPerformanceCounter(per2);
  memo1.Lines.Add('Открытие данных ' + FormatFloat('0.0000', (per2 - per1) / PerSec) + ' сек.');
end;

procedure TfrmCheck.Button2Click(Sender: TObject);
var
  PerSec: int64;
  per1: int64;
  per2: int64;
begin
  //переход на последнюю запись
  QueryPerformanceFrequency(persec);
  QueryPerformanceCounter(per1);
  sqlquery1.Last;
  QueryPerformanceCounter(per2);
  memo1.Lines.Add('Переход на последнюю запись ' + FormatFloat('0.0000', (per2 - per1) / PerSec) + ' сек.');
end;

procedure TfrmCheck.Button3Click(Sender: TObject);
var
  PerSec: int64;
  per1: int64;
  per2: int64;
begin
  // изменение данных в цикле
  sqlquery1.First;
  QueryPerformanceFrequency(persec);
  QueryPerformanceCounter(per1);
  Randomize;
  while not sqlquery1.EOF do
  begin
    sqlquery1.Edit;
    sqlquery1.FieldByName('location').AsInteger:= Random(10);
    sqlquery1.Post;
    sqlquery1.Next;
  end;
  sqlquery1.ApplyUpdates;
  QueryPerformanceCounter(per2);
  memo1.Lines.Add('Изменение всех записей ' + FormatFloat('0.0000', (per2 - per1) / PerSec) + ' сек.');
end;

Код  тестов подсмотрен на sql.ru

 Теперь собственно результаты тестов.

SQLdb

Результат теста.

 

sqldb test

Последняя  строка отсутствует, поскольку после запуска последнего теста программа не дала результата даже через пару часов, поэтому конечное значение неизвестно.

Потребление памяти.

sqldb memory

Памяти программа заняла очень много. Обратите внимание на склон, он возник при переходе к последней записи.

ZeosLib

Результат теста.

zeos testВ принципе довольно таки нормально.

Потребление памяти.

zeos memoryПамяти приложение заняло не много. В процессе работы почти не расходовало процессор. 

UniDAC 

Результаты теста

unidac test

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

Потребление памяти. 

unidac memory

Потребление памяти и процессора оказалось ниже чем у ZEOS, но оно и понятно, все таки разработчики в  Devart поддерживают высокую планку  качества компонентов. 

Подводя итоги.

В общем такой не сложный тест. SQLdb конечно повел себя странно, видимо какие то проблемы в работе у него все таки имеются. Остальные компоненты выступили достойно. Если знаете еще какие либо компоненты доступа к MS SQL под Lazarus, кидайте их в комментарии, обязательно протестирую и добавлю в статью.