Читаем О чём не пишут в книгах по Delphi полностью

  // Вывод линий на картинку

  // Выводится 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-изображений рисунки выводились в разных частях окна и не накладывались друг на друга.

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже