- •Содержание
- •Общие сведения
- •Лабораторная работа № 1. ПроизводительностьHdd.
- •Алгоритм определения производительности
- •Программная реализация
- •Реализация на основе функции GetTickCount()
- •Реализация на основе таймера высокого разрешения
- •Ход работы
- •Лабораторная работа № 2. Определение производительностиCpu
- •Определение тактовой частоты процессора
- •Определение производительности на арифметических и тригонометрических операциях
- •Ход работы
- •Лабораторная работа № 3. Определение производительности сети
- •Описание модуля сетевого взаимодействия
- •Алгоритм тестирования производительности сети
- •Лабораторная работа № 4. Определение производительности графического процессора
Программная реализация
Создайте новый проект «HDDTest» на основе диалогового окна. Перейдите в окноResourceViewи раскройте элемент дереваDialog. Откройте шаблон диалогаIDD_HDDTEST_DIALOGв окне редактора. Не забудьте установить для шаблона русский язык.
Вставьте в панель диалога элементы управления так, как это показано на рис. 1.
Элементам управления присвойте следующие идентификаторы. Элементу редактирования текста (Edit Box):IDC_ESIZE. Списку (List Box):IDC_LPROTO. Кнопке (Button):IDC_BSTART. Выключите у списка свойство «Sort».
Введите в класс CHDDTestDlgпеременные, позволяющие управлять содержимым диалогового окна.
Идентификатор |
Тип |
Имя переменной |
IDC_ESIZE |
int |
m_nSize |
IDC_LPROTO |
CListBox |
m_Proto |
Рис.1. — Вид шаблона диалога
Создайте заготовку для обработчика функции OnBstart().
Далее мы рассмотрим два варианта реализации алгоритма определения скорости записи на жесткий диск: с использованием функции GetTickCount()и с использованием таймера высокого разрешения (функцииQueryPerformanceСounter()иQueryPerformanceFrequency()).
Реализация на основе функции GetTickCount()
Итак, для определения производительности жесткого диска, нам необходимо записать на него данные. Мы можем это сделать, выводя данные в файл. Для работы с файлами существует несколько различных наборов функций. Мы воспользуемся функциями CreateFile(), WriteFile()иCloseHandle().
Создание и открытие файла будем осуществлять с помощью функции CreateFile():
HANDLE CreateFile(
LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreationDisposition,
DWORD dwFlagsAndAttributes,
HANDLE hTemplateFile );
где
lpFileName— указатель на строку содержащую имя и путь к файлу;
dwDesiredAccess— флаги доступа к файлу (для записи, для чтения и др.);
dwShareMode— флаги определяющие общий доступ к файлу;
lpSecurityAttributes— атрибуты безопасности;
dwCreationDisposition— флаги определяющие способ создания файла;
dwFlagsAndAttributes— флаги задающие свойства созданного файла;
hTemplateFile— шаблон файла на основании каких свойств создавать новый файл.
Для записи в файл используем функцию WriteFile():
BOOL WriteFile(
HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped );
где
hFile— манипулятор созданного файла;
lpBuffer— указатель на буфер с данными для записи в файл;
nNumberOfBytesToWrite— количество байт для записи;
lpNumberOfBytesWritten— по этому адресу возвращается количество записанных байт;
lpOverlapped— данные для перекрытого ввода/вывода.
Функция возвращает не нулевое значение в случае успешной записи в файл.
После окончания работы с файлом нам необходимо будет его закрыть с помощью функции CloseHandle():
BOOL CloseHandle( HANDLE hFile );
где
hFile– манипулятор закрываемого файла.
Функция возвращает ненулевое значение в случае успешного закрытия файла.
Теперь нам осталось решить вопрос измерения времени. Для этого будем использовать функцию GetTickCount(). Прототип функции:
DWORD GetTickCount(void);
Она возвращает количество миллисекунд прошедших с момента старта компьютера.
С учетом всего вышеизложенного, обработчик OnBstart()будет выглядеть следующим образом.
void CHDDTestDlg::OnBstart()
{
// TODO: Add your control notification handler code here
UpdateData( true );
doubledSpeed;// скорость записи на диск
double dWriteTime; // время записи на диск
charszBuf[255];// строковый буфер для вывода информации
DWORDdwNumberOfBytesWritten;// количество записанных в файл байт
// динамически создаем буффер для записи
char *pFileBuf = new char [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);
// фиксируем время начала записи
DWORD dwTime = GetTickCount();
// записываем данные в файл
WriteFile( hFile, pFileBuf, m_nSize, &dwNumberOfBytesWritten, NULL );
// вычисляем продолжительность записи
dWriteTime = ( GetTickCount() –dwTime) / 1000.;
// Закрываем файл
CloseHandle(hFile);
// удаляем буффер
delete[]pFileBuf;
// удаляем файл
DeleteFile( "C:\\file.dat" );
// проверяем не равен ли знаменатель нулю. Это может случиться в том случае
// когда размер данных слишком мал и разрешающей способности функции
// GetTickCount() не достаточно, чтобы зафиксировать длительность процесса
// записи
if ( dwTime == 0 )
{
sprintf(szBuf, "Малый размер данных" );
}
else
{
// рассчитываем скорость записи на диск в МБт/с
dSpeed=m_nSize/ (dWriteTime * 1000000. );
sprintf(szBuf, "Скорость записи: %.4gМБт/с",dSpeed);
}
m_Proto.AddString( szBuf );
}