Суммирование элементов массива с использованием указателя не требует приведенного выше вложенного цикла. Самостоятельно проверьте, как изменится время суммирования при использовании оператора for (i - 0; i < 400; i++) Sum +- *p++.

Легко также убедиться, что работа программы заметно ускоряется при замене типа индексов с char i. j на int i.j.

Если теперь добавить к рассмотренному коду функцию InitAppO из проекта Minim, то получится работоспособное приложение. Чтобы стали доступны функции работы со временем, в проект надо добавить библиотеку winmm.lib.

Система Windows также обеспечивает доступ к счетчику tsc при помощи двух функций:

B00L QueryPerformanceFrequencyC LARGE_INTEGER *lpFrequency ); B00L QueryPerformanceCounterC LARGEJNTEGER *lpPerformanceCount ).

Первая функция записывает в переменную, на которую указывает lpFrequency, значение входной частоты /0. Вторая функция записывает в *lpPerformanceCount количество импульсов частоты /0, поступивших с момента старта системы. Обе функции возвращают значение 0, если в процессоре счетчик TSC отсутствует.

Для представления 64-разрядных целых чисел рассматриваемым функциям передается указатель на объединение LARGE_I NTEGER, описанный следующим образом:

typedef union _LARGE_INTEGER
struct{
DWORD LowPart; LONG HighPart: }:
L0NGL0NG QuadPart;

Задания для самостоятельного выполнения

}
LARGEJNTEGER.

Таким образом, можно обращаться к старшим и младшим 32 разрядам числа при помощи полей LowPart, HighPart или манипулировать им как единым числом, обращаясь к элементу QuadPart.

Компилятор организует программное выполнение операций с числами типа L0NGL0NG следующим образом:

Wremja - (int)(Finish.QuadPart-Start.QuadPart):

В листинге 4.9 приведен фрагмент оконной процедуры, измеряющей время при помощи рассмотренных выше функций.

Листинг 4.9

case WM_RBUTT0ND0WN: {

char i.j; // Индексы массива.

int Sum - 0: //Переменная для подсчета суммы элементов.

char S[80]; //Строка для вывода результатов на экран.

LARGEJNTEGER Start .Finish.Freq:
double kF;
int iFreq.Wremja.Wremjal.Wremja2: QueryPerformanceFrequency( &Freq); kF - Freq.QuadPart/1000000.0;

⇐ Предыдущая| |Следующая ⇒