Суммирование элементов массива с использованием указателя не требует приведенного выше вложенного цикла. Самостоятельно проверьте, как изменится время суммирования при использовании оператора 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;