Листинг 4.5
typedef struct _RdTSC {
double Speed; //Тактовая частота в мегагерцах.
int Over; //Накладные расходы в тактах на засечку времени.
char ss[110]; //Текст заголовка окна с информацией о тактовой частоте. } RdTSC; RdTSC SpeedCPU; Задания для самостоятельного выполнения Поля этой структуры будут заполняться процедурой, которая определяет количество импульсов тактовой частоты, поступивших за фиксированный интервал времени Tick, а также выводит значение частоты в заголовок окна.
Для отсчета интервала Tick можно использовать функцию GetTickCountC) или timeGetTimeC). Справочная система сообщает, что обе они возвращают время в миллисекундах, прошедшее с момента пуска системы. Чтобы выбрать подходящую функцию, надо протестировать их и проверить дискретность результата. Для этого можно использовать довольно простой фрагмент кода:
TimeO - GetTickCountC):
while( (Time - GetTickCountC)) - TimeO < 1);
Когда-то на компьютере с системой Windows 95 получилось, что Time - TimeO = 5, то есть показания, возвращаемые функцией GetTi ckCount С), изменялись с дискретностью 5 мс. А тот же опыт с timeGetTimeC) показал, что эта функция изменяет показания каждую миллисекунду. Потом я много раз повторял этот тест с другими системами, и разницы нигде не было. Но до сих пор я по привычке применяю timeGetTimeC). Именно она используется в функции, которая позволяет измерить производительность системы, как это показано в листинге 4.6.
Листинг 4.6
RdTSC Calibrate (int Tick.HWND hwnd-NULL) {
RdTSC Res:
_int64 Start.Finish:
int dwStartO.dwStart. Temp;
char s[85];
//Определяем накладные расходы на фиксацию начала и конца интервала. dwStart - timeGetTimeC): //Начало интервала в миллисекундах. Start - HightTimeO: //Начало интервала в тактах процессора. whileCtimeGetTimeC) - dwStart < 0); //Интервал нулевой длительности. Finish - HightTimeO: //Конец интервала в тактах процессора. Temp-(int)CFinish-Start); //Накладные затраты времени в тактах процессора. //Определяем количество тактов процессора в интервале Tick. dwStartO = timeGetTimeC);