// Вывод линий на картинку
// Выводится Cnt линий со случайными координатами
QueryPerformanceCounter(StartTime);
for I:= 1 to Cnt do
begin
Pict.Canvas.Pen.Color:=
RGB(Random(256), Random(256), Random(256));
Pict.Canvas.MoveTo(Random(PictSize), Random(PictSize));
Pict.Canvas.LineTo(Random(PictSize), Random(PictSize));
end;
QueryPerformanceCounter(EndTime);
GridResults.Cells[ColNum, 1]:=
FloatToStrF((EndTime — StartTime) / Freq * 1000, ffFixed, 10, 2);
// Вызываем Application.ProcessMessages, чтобы GridResults
// перерисовался в соответствии с новым значением ячейки
Application.ProcessMessages;
// Второй тест — вывод рисунка на экран
QueryPerformanceCounter(StartTime);
// Повторяем вывод рисунка на экран Cnt раз
// Чтобы пользователь мог видеть, когда вывод
// заканчивается, каждый раз добавляем к координатам
// случайную величину
for I:= 1 to Cnt do
Canvas.Draw(XOfs + Random(50), 10 + Random(50), Pict);
QueryPerformanceCounter(EndTime);
GridResults.Cells[ColNum, 2]:=
FloatToStrF((EndTime — StartTime) / Freq + 1000, ffFixed, 10, 2);
Application.ProcessMessages;
// Третий тест — доступ к свойству ScanLine
QueryPerformanceCounter(StartTime);
// Обращаемся к случайной строке свойства ScanLine
// Cnt раз
for I:= 1 to Cnt do
P:= Pict.ScanLine(Random(PictSize));
QueryPerformanceCounter(EndTime);
GridResults.Cells[ColNum, 3]:=
FloatToStrF((EndTime — StartTime) / Freq * 1000, ffFixed, 10, 2);
Application.ProcessMessages;
finally
Pict.Free;
end;
end;
Для измерения скорости работы будем использовать счетчик производительности — это высокопроизводительный счетчик, поддерживаемый системой для измерения производительности. Текущее значение счетчика можно узнать с помощью функции QueryPerformanceCounter
, число тактов счетчика в секунду — с помощью функции QueryPerformanceFrequency
. Этот счетчик позволяет получить более точные результаты, чем традиционно применяющаяся для таких целей функция GetTickCount
. Теоретически, счетчик производительности может не поддерживаться аппаратной частью (в этом случае функция QueryPerformanceFrequency
вернет нулевую частоту), однако все современные компьютеры такой счетчик поддерживают, поэтому его можно применять без опасений.
В зависимости от параметра PixelFormat
метод DoTest
создает DDB- или DIB-изображение и тестирует скорость исполнения операций с ним. В первом тесте Cnt
раз рисуется линия случайного цвета со случайными координатами — так проверяется скорость рисования на картинке. Разумеется, это весьма односторонний тест, т. к. при рисовании других примитивов будет, скорее всего, иное соотношение скоростей для DIB и DDB. Но общее представление о соотношении скоростей он все же дает.
Во втором тесте полученное изображение Cnt
раз выводится на экран. Если бы оно выводилось всегда в одном и том же месте, пользователь не видел бы процесс вывода на экран, т. к. каждый следующий раз картинка рисовалась бы точно в том же месте, что и в предыдущий, и общее изображение не менялось бы. Чтобы этого не происходило, изображение выводится со случайным смещением относительно базовых координат, и пользователь может наблюдать за процессом. Кроме того, координаты определяются также параметром XOfs — это сделано для того, чтобы при тестировании DDB- и DIB-изображений рисунки выводились в разных частях окна и не накладывались друг на друга.