    Создание класса измерения производительности 

    Теперь, когда базовый класс найден и протестирован, следующим шагом будет 
создание производного TTimer класса. Классу необходим конструктор вместе с 
функциями-членами для вызова тестируемой функции и сообщения о затраченном 
времени в заданном числе тестов. В листинге 14.1 приводится один из вариантов
создания класса, удовлетворяющего всем вышеперечисленным требованиям. 
Поскольку это всего лишь заголовочный файл, вы не сможете скомпилировать его. 

    Листинг 14.1.  BENCH.H (объявление класса TBench) 

    1:   // bench.h -- Объявление класса TBench 
    2: 
    3:   #ifndef __BENCH_H 
    4:   #define __BENCH_H 1 // Предотвращение нескольких «include 
    5: 
    6: #include <classlib\timer.h> 
    7: 
    8: typedef void (* testfn)(void); 
    9:	
    10: class TBench: public TTimer { 
    11: public:	
    12:  TBenchQ: TTimer() { }                                 
    13:  void Benchmark(long numTests, testfn tf); 
    14:  void Report(void); 
    15: }; 
    16:	
    17: #endif // __BENCH_H

    Класс TBench выводится из TTimer. Конструктор TBenchO (строка 12) вызывает 
конструктор базового класса TTimer, но не выполняет никаких новых операторов 
для конструирования объекта TBench. Функци член Benchmark() (строка 13) имеет 
два параметра — numTests, равный числу тестов, которые необходимо выполнить, и 
tf, ссылающийся на тестируемую функцию, которая должна иметь тип void и не 
должна имет параметров (см. typedef в строке 8). Вторая функция-член ReportO, 
определенная в строке 14, отображает pезультат теста.	
    В листинге 14.2 приводится реализация производного класса TBench. 
Следующая программа демонстрирует использование этого модуля, поэтому не 
компилируйте его пока. 

    Листинг 14.2.  BENCH.CPP (реализация класса TBench) 

    1:	// bench. срр -- Реализация класса TBench 
    2: 
    3:	#include <stdio.h> 
    4:	#include "bench. h" 
    5: 
    6:	// Вызывает тестируемую функцию tf  numTests раз 
    7:	void TBench: : Benchmark (long numTests, testfn tf);
    8:	
    9:	printf( "Running %ld tests", numTests); 
    10:	Reset();   // Reset timer to zero 
    11:	Start() ;   // Start timing 
    12:	while (--numTests >= 0) 
    13:	   (* tf)(); // Call user test function 
    14:	Stop();    // Stop timing 
    15:	puts( "\nTests completed"); 
    16:	} 
    17:	
    18:	// Выводит результаты теста 
    19:	void TBench::Report(void)      
    20:	{
    21:	   double result = Time();
    22:	   if (result < Resolution())	
    23:	      putsC'Results too small for accuracy"); 
    24:	   printf( "Elapsed time == %6f sec. \n", result); 
    25:	}

    В строках 7-16 реализуется функция-член Benchmark(). После отображения 
числа выполняемых тестов, функция сбрасывает и запускает таймер с помощью 
вызова наследованных функций-членов Reset() и Start(). 
    В строках 12-13 вызывается необходимое число раз тестируемая функция, 
адрес которой хранится в указателе tf. После завершения последнего теста в 
строке 14 вызывается еще одна наследованная функция-член Stop(), прерывающая 
отсчет времени. В строке 15 выводится короткое сообщение о том, что тесты 
завершены.


    348 Часть III. Программирование на ANSI C++ 

