Чтение онлайн

на главную

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:

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

На некоторых компьютерах в этом тесте с DDB-изображением наблюдается интересный эффект: время, измеренное программой, заметно меньше, чем время, когда картинка меняется на экране (например, пользователь ясно видит, что тест выполняется в течение примерно трех секунд, в то время как программа дает значение около одной секунды). Это связано со способностью некоторых видеокарт буферизовать переданные им команды и выполнять их асинхронно, т.е. вызов функции завершается очень быстро, программа продолжает работать дальше, а видеокарта параллельно ей выполняет команду. Если вы столкнетесь с такой ситуацией, можете провести небольшой эксперимент: вставить вызов функции Beep сразу после окончания второго теста. Вы услышите звуковой сигнал раньше, чем изображение закончит меняться.

Третий тест самый простой:

Cnt
раз значение свойства ScanLine присваивается переменной
P
. Так как значение
P
потом нигде не используется, компилятор выдает соответствующую подсказку, но в данном случае ее можно игнорировать.

Таким образом, метод

DoTest
нужно вызвать два раза: для DDB-изображения и для DIB это делает обработчик нажатия кнопки
BtnStart
(листинг 1.41).

Листинг 1.41. Обработчик нажатия кнопки
BtnStart

procedure TForm1.BtnStartClick(Sender: TObject);

var

 IterCnt, RandomStart: Integer;

begin

 IterCnt := StrToInt(EditIter.Text);

 GridResults.Cells[1, 1] := '';

 GridResults.Cells[1, 2] := '';

 GridResults.Cells[1, 3] := '';

 GridResults.Cells[2, 1] := '';

 GridResults.Cells[2, 2] := '';

 GridResults.Cells[2, 3] := '';

 // Чтобы новый текст ячеек отобразился в GridResults,

 // нужно, чтобы было извлечено их очереди и обработано

 // сообщение WM_PAINT. Чтобы сделать это немедленно,

 // вызываем Application.ProcessMessages.

 Application.ProcessMessages;

 Random.Start := Random(MaxInt);

 Screen.Cursor := crHourGlass;

 // Точное измерение времени выполнения кода в Windows

 // невозможно, потому что это многозадачная система, и

 // часть измеренного времени может быть потрачена на

 // выполнение кода других процессов. Чтобы максимально

 // уменьшить погрешность измерения, нужно установить

 // наивысший приоритет процессу и его главной нити -

 // тогда вероятность переключения процессора на

 // выполнение другой задачи будет минимальным. Столь

Поделиться:
Популярные книги

Золушка по имени Грейс

Ром Полина
Фантастика:
фэнтези
8.63
рейтинг книги
Золушка по имени Грейс

Отмороженный 6.0

Гарцевич Евгений Александрович
6. Отмороженный
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Отмороженный 6.0

Заставь меня остановиться 2

Юнина Наталья
2. Заставь меня остановиться
Любовные романы:
современные любовные романы
6.29
рейтинг книги
Заставь меня остановиться 2

Бальмануг. (не) Баронесса

Лашина Полина
1. Мир Десяти
Фантастика:
юмористическое фэнтези
попаданцы
5.00
рейтинг книги
Бальмануг. (не) Баронесса

Седьмая жена короля

Шёпот Светлана
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Седьмая жена короля

Камень. Книга вторая

Минин Станислав
2. Камень
Фантастика:
фэнтези
8.52
рейтинг книги
Камень. Книга вторая

Неудержимый. Книга IX

Боярский Андрей
9. Неудержимый
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Неудержимый. Книга IX

Вперед в прошлое!

Ратманов Денис
1. Вперед в прошлое
Фантастика:
попаданцы
5.00
рейтинг книги
Вперед в прошлое!

6 Секретов мисс Недотроги

Суббота Светлана
2. Мисс Недотрога
Любовные романы:
любовно-фантастические романы
эро литература
7.34
рейтинг книги
6 Секретов мисс Недотроги

Приручитель женщин-монстров. Том 3

Дорничев Дмитрий
3. Покемоны? Какие покемоны?
Фантастика:
юмористическое фэнтези
аниме
5.00
рейтинг книги
Приручитель женщин-монстров. Том 3

Странник

Седой Василий
4. Дворянская кровь
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Странник

На границе империй. Том 7. Часть 4

INDIGO
Вселенная EVE Online
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 7. Часть 4

В зоне особого внимания

Иванов Дмитрий
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
В зоне особого внимания

Назад в СССР: 1985 Книга 2

Гаусс Максим
2. Спасти ЧАЭС
Фантастика:
попаданцы
альтернативная история
6.00
рейтинг книги
Назад в СССР: 1985 Книга 2