Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
mlr_EVM v ASUTP_3.0.doc
Скачиваний:
5
Добавлен:
10.02.2016
Размер:
201.73 Кб
Скачать

Реализация на основе таймера высокого разрешения

Теперь рассмотрим альтернативную реализацию определения производительности жесткого диска в которой интервалы времени будем измерять при помощи таймера высокого разрешения. Для работы с таким таймером существует две функции QueryPerformanceFrequency()иQueryPerformanceCounter(). Первая позволяет получить частоту работы таймера высокого разрешения (если он существует). Ее прототип:

BOOL QueryPerformanceFrequency( LARGE_INTEGER *lpFrequency );

где:

lpFrequency— указатель на частоту таймера.

В случае успешного выполнения функция возвращает ненулевое значение.

Функция QueryPerformanceCounter()имеет аналогичный прототип:

BOOL QueryPerformanceCounter( LARGE_INTEGER *lpFrequency );

и позволяет получить текущее количество тиков таймера высокого разрешения.

Очевидно, что разделив разность тиков между двумя событиями на частоту мы получим время, прошедшее между этими событиями.

Отметим, что частота таймера высокого разрешения зависит от операционной системы. Для Windows 2000/XPона составляет3579545. Таким образом, таймер высокого разрешения позволяет измерять микросекундные интервалы времени, в то время как функцияGetTickCount()— милисекундные.

В целом реализация алгоритма определения производительности жесткого диска с использованием таймера высокого разрешения очень похожа на реализацию с помощью функции GetTickCount(). Код обработчикаOnBstart()примет вид:

void CHDDTestDlg::OnBstart()

{

// TODO: Add your control notification handler code here

UpdateData( true );

doubledSpeed;// скорость записи на диск

charszBuf[255];// строковый буфер для вывода информации

DWORDdwNumberOfBytesWritten;// количество записанных в файл байт

// динамически создаем буффер для записи

char*pFileBuf=newchar[m_nSize];

// заполняем буффер данными (все равно какими). В данном случае символом ‘a’

memset(pFileBuf, ‘a’,m_nSize);

// Создаем файл

HANDLE hFile = CreateFile( "C:\\file.dat", FILE_ALL_ACCESS, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);

LARGE_INTEGER nStart, nStop, nFreq;

double dTime;

// получаем частоту таймера

QueryPerformanceFrequency( &nFreq );

// фиксируем время начала записи

QueryPerformanceCounter( &nStart );

// записываем данные в файл

WriteFile(hFile, pFileBuf, m_nSize, &dwNumberOfBytesWritten, NULL);

// фиксируем время окончания записи

QueryPerformanceCounter( &nStop );

// вычисляем продолжительность записи

dTime = double( nStop.QuadPart - nStart.QuadPart ) / nFreq.QuadPart;

// закрываем файл

CloseHandle(hFile);

// удаляем буффер

delete[] pFileBuf;

// удаляем файл

DeleteFile( "C:\\file.dat" );

if ( dTime == 0 )

{

sprintf( szBuf, "Малый размер данных" );

}

else

{

// рассчитываем скорость записи на диск в МБт/с

dSpeed = m_nSize / ( dTime * 1000000 );

sprintf(szBuf, "Скорость записи: %.4gМБт/с",dSpeed);

}

m_Proto.AddString( szBuf );

}

Ход работы

1. Разработать пользовательский интерфейс.

2. Реализовать алгоритм тестирования на основе функции GetTickCount().

3. Реализовать алгоритм тестирования на основе таймера высокого разрешения.

4. Определить производительность произвольного компьютера и сравнить ее с известными данными.

5. Реализовать функции тестирования во внешнем h-файле.

6. Реализовать функции тестирования во внешних h- и срр- файлах.

7. Реализовать функции тестирования во внешнем файле или файлах по желанию. При этом для тестирования должна быть предназначена одна универсальная функция которая выдает результаты определения производительности HDDкак с использованием счетчика, так и с использованием таймера высокого разрешения. Сама функция непосредственно должна возвращать код ошибки. В качестве аргумента функции должна выступать структура в поля которой будут заноситься результаты тестирования.

8. Оформить протокол.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]