Главная » 2D графика » Обзор формата DIB и компонентов для работы с ним

RSS

Обзор формата DIB и компонентов для работы с ним

Тестирование

Расскажу как проводилось тестирование. Тестирование таких программных продуктов, как компоненты, проводилось мною в первые. Методик тестирование так же не было ( а у Вас они есть ? ). Все приходилось придумывать на ходу. По этой простой причине нельзя со 100% уверенностью верить результатам этих тестов, но сравнительную оценку провести можно.

Итак, тесты проводились на одном и том же компьютере :) следующей конфигурации : Celeron 366, 96 Мб, Intel 740 8Мб, Винчестер 2 Мб 7200 оборотов.

Первый тест, который был мной разработан – скорость загрузки BMP файла в память. У всех рассматриваемых компонентов был метод LoadFormFile, по этому осуществить это не составляло особого труда. После загрузки файла, таймер останавливался и проверялось наличие загруженного изображения в компоненте. Как это проверить проще всего – вывести его на экран.

Для теста я подготовил четыре изображения:

1000 x 1000 x 24 bit
3000 x 3000 x 24 bit
4000 x 4000 x 8 bit
4000 x 4000 x 24 bit

Размер самого большого файла составлял 48 мегабайт, в тестируемой системе оставалось свободным ~60-70 Мб, что отменяло проблему свопинга. После каждого измерения проводилась дефрагментация памяти для удаления изображения из памяти и своп файла.

Программно тест выглядит совсем просто:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.LoadTest(Sender: TObject);
var
  Bitmap:TBitmap;
  X:integer;
  S:String;
begin
  Bitmap:=TBitmap.Create;
  Case RadioGroup.ItemIndex of // в зависимости от выбранного индекса
    0: S:='..\1000.bmp';       // загружаем нужный файл
    1: S:='..\3000.bmp';
    2: S:='..\4000.bmp';
    3: S:='..\4000hi.bmp';
  end;
  X:=GetTickCount;            // включаем таймер
  Bitmap.LoadFromFile(S);
  X:=GetTickCount-X;
  MessageDlg('Time : '+IntToStr(X)+' ms',mtInformation,[mbOK],0);
  Image1.Picture.Assign(Bitmap); // проверяем есть ли изображение
  Bitmap.Free;
end;

Что нам может показать этот тест?

Во первых возможность компонента обрабатывать большие изображения. Компонент TDibUltra несколько раз вылетал с ошибкой, при попытке загрузки файла 4000 x 4000 x 24 bit. Все остальные компоненты справились с тестом без ошибок.

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

Следующий тест касался быстродействия обращения к отдельным элементам изображения – метод Pixels. Тест проводился следующим образом – создавалось изображение 1000 x 1000 x 24 bit и последовательно закрашивалось пикселями определенного цвета. Сначала я хотел заполнять каждый пиксель случайным цветом, но полученный разлет результатов просто ошеломлял 10-20 ms. Это связано со спецификой получения «случайного» числа. Дело в том, что случайное число получается не просто опросом процессора, этой операции предшествует некоторые специфические циклы ( на уровне железа ), повторяются они не всегда одинаковое число раз.

Программно тест реализуется примерно следующим образом:

1
2
3
4
5
6
7
8
9
10
11
var
Bitmap:TDibUltra;
I,J,X:integer;
 
... X:=GetTickCount;
for I:=0 to 1000 do
  for J:=0 to 1000 do
    Bitmap.Pixels[i,j]:=clRed;
X:=GetTickCount-X;
MessageDlg ('Time : '+IntToStr(X)+' ms',mtInformation,[mbOK],0);
Bitmap.DrawOn(Rect(0,0,300,300),Canvas,0,0); // проверка заполнения

Теперь по поводу результатов. Лидеры тестов TFastDIB и TUniDib. Данный тест не прошел только TBitmap, об этом более подробно.

Все дело в том, что у TBitmap нет свойства Pixels. В тесте я сделал обращение через TBitmap.Canvas.Pixels[x,y]. Вы должны понимать, что так поступать нельзя ( смотрите полученные результаты ) – это то же самое, что забивать скрипкой Страдивари гвозди в стену. Напомню, что для быстрой работы с TBitmap, существует свойство ScanLine. Если использовать его, то получатся результаты близкие к показателям других тестированных компонентов.

Следующий тест касается быстроты вывода изображения, точнее его участка. Для проведения этого теста я загружал в тестируемый компонент BMP файл размером 1000 x 1000 x 24 bit и на Canvas формы выводил изображение размером 400 x 400 пикселей. Не все компоненты имеют свойство Draw или что то подобное, по этому в некоторых случаях приходилось использовать стандартную API функцию BITBLT. В таблице такие результаты помечены звездочкой *.

Результаты тестов. Два безусловных лидера TFastDIB и TUniDib.

Вот все результаты тестов в табличном виде:

Страницы : 1 2 3 4 5 6

Таги: ,