
7. Измерение времени
void runtimer();
float timer();
Эта пара функций обслуживает таймер, который может использоваться для измерения промежутков времени. Процедура runtimer осуществляет сброс и пуск таймера. Функция timer возвращает текущее значение таймера в секундах. Точность измерения времени определяется частотой прерываний, которые генерируются системным таймером компьютера. Получить значение этой частоты можно, прочитав системную переменную CLK_TCK .
Пример использования функций таймера:
#include <syst.h>
void main()
{ float t;
runtimer();
printr("Сделайте паузу и нажмите ENTER\n");
pause;
t=timer();
printf("timer = %5.2f sec \n",t);
}
Разрешающая способность указанных таймеров составляет примерно 0.05 с. Отсюда следует, что для измерения времени с точностью 1%, измеряемый промежуток времени должен превышать 5 с.
Функции микросекундного таймера имеют намного лучшее разрешение, равное 1 мкс (0.000001 с.), однако использование этих функций имеет ряд особенностей.
1. В системной папке ..\BIN должен присутствовать ассеблерный компилятор tasm32.exe.
2. При использовании BORLAND C++ 5.01 необходимо активировать компилятор BORLAND (не Intel !).
3. В самом начале компилируемой программы должно быть записано определение
#define _STIMER_
разрешающее компиляцию функций и определений микросекундного таймера.
4. Для получения абсолютных значений измеряемого интервала времени необходимо установить правильное значение системной переменной CPU_Frequency. Сделать это можно либо вручную, подправив соответствующую строку в начале файла syst.h, либо использовать процедуру set_cpu_fr(), которая сделает это сама.
5. Правила выбора имени исходного файла должны соответствовать также и правилам этого компилятора. В частности, имя компилируемого файла не должно начинаться с цифры.
Ниже приведено описание основных функций микросекундного таймера.
void runstimer();
Инициализация микросекундного таймера.
ulong mcstimer()
Текущее значение таймера в микросекундах.
double stimer();
Текущее значение таймера, представленное как число тактов процессора в формате double.
void set_cpu_fr();
Эта процедура определяет тактовую частоту используемого процессора и устанавливает соответствующее значение системной переменной CPU_Frequency. Время измерения тактовой составляет примерно 10 с, относительная погрешность измерения равна 0.025% .
Функции микросекундного таймера используют специальный регистр процессора TSC (счетчик тактов процессора). Об идее использования этого регистра для построения программного таймера можно прочитать в [6].
8. Парный обмен, сортировка, поиск, текущие время и дата
void swp(Type& a, Type& b);
Процедура парного обмена: переменные a,b меняются значениями. Помимо процедуры swp с шаблоном, предусмотрена специальная реализация процедуры для парного обмена asciiz-строк символов:
void swp(char* s1, char* s2);
При использовании этой процедуры необходимо позаботиться о том, чтобы массивы, представленные указателями s1 и s2 имели размеры, достаточные для выполнения операции обмена.
void sortup(int i, int k, Type* p);
Сортировка отрезка [i .. k] массива p по возрастанию.
void sortdown(int i, int k, Type* p);
Сортировка отрезка [i .. k] массива p по убыванию.
int b_find(Type* A, int n, const type& key)
Поиск в массиве A размером n по ключу key. Используется алгоритм бинарного поиска.
char* rdate();
char* rtime();
Эта пара функций возвращает указатель на строку, которая представляет текущие дату и время в украинском формате и в компактной форме.