Студопедия

КАТЕГОРИИ:

АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Int RangedRand( int range_min, int range_max)




{

double res=(double)rand() / (RAND_MAX + 1) * (range_max - range_min) + range_min;

return static_cast<int>(res);

}



Профилирование программы в Microsoft Visual Studio 6.0

Под профилированием программы понимается получение и анализ статистики по времени выполнения функций или строк программы, количеству вызванных функций, числу вызовов функций и т.д. с целью сокращения времени выполнения программы в целом или отдельных ее фрагментов. Профилирование помогает выявить «узкие» места программы, т.е. критичные по времени выполнения.

Для профилирования в принципе можно использовать какие-либо свои собственные средства, например, фиксировать время работы программы с помощью секундомера или встраивать в программный код фиксацию времени и т.п., но это неэффективно и сопряжено с многими проблемами. Например, просто фиксация системного времени даст в общем случае большие погрешности, так как процессорное время Windows дает не только Вашему приложению. А если в приложении несколько потоков?

Одним словом, профилирование программы проще всего осуществить с использованием средства Profile Microsoft Visual C++ (профайлер), которое имеется в версиях Professional и Enterprise Editions.

Прежде всего, для профилирования программы выполните команду ProjectÞProject settings и на вкладке Link отметьте флажок Enable Profiling.

Далее выполните команду BuildÞProfile, в результате чего будет показано окно настроек профилирования (рис.1).

Рис. 1. Окно настроек профайлера

 

Смысл режимов профайлера следующий.

В режиме Function Timing профайлер фиксирует число вызoвов каждой функции (hit count) и время выполнения данной функции и вызываемых ею других функций. При выборе этого режима и выполнения программы (нажатия кнопки ОК) на вкладке Profile в окне Output появится информация вида:

Func       Func+Child

Time %  Time   %  Hit Count Function

------------------------------------------------------------

16,448 10,8 25,886 16,9 231071 _Destroy(double *)

 

Единица измерения времени указывается в окне вывода статистики и обычно это миллисекунды (мсек).

В столбце Func Time указывается время выполнения операторов функции без учета времени выполнения тех функций, которые она вызывает. В следующем столбце показывается то же время, но в процентах (от всего времени профилирования).

 В столбце Func+Child Time указывается время выполнения данной функции в мсек. с учетом времени выполнения вызываемых ею функций, а в четвертом столбце – то же время, но в процентах.

В столбце Hit Count показывается число вызовов функции, а в следующем столбце – ее имя.

В режиме Function coverage профайлер фиксирует факт вызoва каждой функции. При выборе этого режима и выполнения программы на вкладке Profile в окне Output появится список всех функций программы, в том числе и вызываемых ими, и фактически вызванные функции будут отмечены символом *. Таким образом, этот режим позволяет выявить те участки кода, которые были фактически выполнены.

В режиме Line coverage профайлер показывает в своем окне все строки программного кода, в том числе и из включенных файлов, и отмечает символом * те из них, которые были фактически выполнены. Подобно режиму Function coverage, этот режим также позволяет выявить те участки кода, которые были фактически выполнены. Как можнопредположить, объем выводимых данных при этом будет весьма немалым.

В режиме Merge (слияние, объединение) профайлер позволяет выполнять многочисленные запуски программы с различными данными и в своем окне отображает накопленные данные. Для использования этого режима надо один раз выполнить прифилирование в любом другом режиме, а затем выбрать Merge и выполнять профилирование любое число раз. Таким образом, этот режим позволяет объединить результаты профилирования, полученные при выполнении программы с различными исходными данными (но с неизменным кодом, т.е. без перестройки программы).

Наконец, режим Custom позволяет указать пакетный файл (в поле ввода Custom Settings), в котором должны содержаться команды для профайлера (подробные сведения ­ – в MSDN).

В поле ввода Advanced Settings можно указать дополнительные команды для профайлера. Например, указание в этом поле строки вида

/EXCALL /INC file1.obj

 

означает, что из профилирования исключаются все объектные файлы и библиотеки (/EXCALL) и включается в профилирование (/INC) только файл file1.obj (другие подробности ­ – в MSDN).

 

 



Некоторые функции API Win32

Получение информации о компьютере и операционной системе

В состав Windows SDK входит множество функций, предназначенных для получения информации об установленной операционной системе и компьютере. Описание некоторых из функций приведены ниже, а информацию об остальных можно найти, как обычно, в MSDN. Имена этих функций начинаются с префикса GetSystem. Кроме того, с помощью функции SystemParametersInfo() можно получить или установить значения некоторых параметров системы или приложения.

В целом, ищите в MSDN функции, имена которых начинаются с префиксов Get или Set для получения или задания значений всевозможных свойств и параметров. См. также раздел MSDN “System Information”.

Функция GetLogicalDrives

 

Функция GetLogicalDrives возвращает число (битовую маску), в котором хранятся все доступные в системе логические диски.

DWORD GetLogicalDrives(VOID);

 

Возвращаемое значение:

Если функция вызвана успешно, то она возвращает целое 32-разрядное число, биты которого соответствуют дискам (если бит 0 равен 1, то диск "A:" присутствует и т.д.). При наличии ошибки функция возвращает 0.

Пример:

DWORD dr = GetLogicalDrives();

cout << "Available disk drives :" << endl;

for( int i = 0; i < 26; i++ )

{

int n = ((dr>>i)&0x00000001);

if(n) cout<<char(65+i)<<':'<<'\\'<<’ ‘;

}

cout<<endl;

 

Функция GetDriveType

 

 

Функция GetDriveType возвращает тип диска (сменный, фиксированный, CD-ROM, RAM диск или сетевой).

UINT GetDriveType(LPCTSTR lpRootPathName);

 

Параметр:

lpRootPathName

 

[in] Указатель на строку, в которой хранится имя корневого каталога диска, например, “C:\\”. Обратите внимание на наличие обратного слеша.

Если lpRootPathName==NULL, то функция возвращает информацию о текущем каталоге.

 

Возвращаемое значение:

Функция возвращает тип диска. Могут быть следующие значения:

Значение Описание
DRIVE_UNKNOWN Неизвестный тип.
DRIVE_NO_ROOT_DIR Неправильный путь.
DRIVE_REMOVABLE Съёмный диск.
DRIVE_FIXED Фиксированный диск.
DRIVE_REMOTE Удалённый или network диск.
DRIVE_CDROM CD-ROM диск.
DRIVE_RAMDISK RAM диск.

 

 

Пример:

int d = GetDriveType( "c:\\" );

if( d == DRIVE_UNKNOWN ) cout << " UNKNOWN" << endl;

if( d == DRIVE_NO_ROOT_DIR ) cout << " DRIVE NO ROOT DIR" << endl;

if( d == DRIVE_REMOVABLE ) cout << " REMOVABLE" << endl;

if( d == DRIVE_FIXED ) cout << " FIXED" << endl;

if( d == DRIVE_REMOTE ) cout << " REMOTE" << endl;

if( d == DRIVE_CDROM ) cout << " CDROM" << endl;

if( d == DRIVE_RAMDISK ) cout << " RAMDISK" << endl;

 

 

Функция GetDriveType

 

Функция GetVolumeInformation возвращает информацию о файловой системе и дисках.

 

BOOL GetVolumeInformation(

LPCTSTR lpRootPathName,    // имя корневого каталога диска [in]

LPTSTR lpVolumeNameBuffer, // имя тома (диска)             [out]

DWORD nVolumeNameSize,     // длина буфера имени тома (диска) [in]

LPDWORD lpVolumeSerialNumber, // серийный номер диска         [out]

LPDWORD lpMaximumComponentLength, //максимальная длина файла [out]

LPDWORD lpFileSystemFlags, // флаги файловой системы       [out]

LPTSTR lpFileSystemNameBuffer, // имя файловой системы         [out]

DWORD nFileSystemNameSize // длина буфера имени файл. сист. [in]

);

 

Возвращаемое значение:

Если функция вызвана правильно, то она возвращает не нулевое значение(TRUE).

Если функция вызвана не правильно, то она возвращает 0(FALSE).

 

Пример:

char VolumeNameBuffer[100];

char FileSystemNameBuffer[100];

unsigned long VolumeSerialNumber;

 

BOOL GetVolumeInformationFlag = GetVolumeInformationA(

"c:\\",

VolumeNameBuffer,

100,

&VolumeSerialNumber,

NULL, //&MaximumComponentLength,

NULL, //&FileSystemFlags,

FileSystemNameBuffer,

100

); 

 

if(GetVolumeInformationFlag != 0)

{

cout << "Volume Name is " << VolumeNameBuffer << endl;

cout << "Volume Serial Number is " << VolumeSerialNumber << endl;

cout << "File System is " << FileSystemNameBuffer << endl;

}

else cout << "Not Present (GetVolumeInformation)" << endl;

 

Функция GetDiskFreeSpaceEx

 

Функция GetDiskFreeSpaceEx выдаёт информацию о доступном месте на диске.

 

BOOL GetDiskFreeSpaceEx(

LPCTSTR lpDirectoryName, // имя диска(директории)       [in]

PULARGE_INTEGER lpFreeBytesAvailable, // свободно (байт) [out]

PULARGE_INTEGER lpTotalNumberOfBytes, // макс. Объём (байт) [out]

PULARGE_INTEGER lpTotalNumberOfFreeBytes //свободно на диске (байт) [out]

);

 

Возвращаемое значение:

Если функция вызвана правильно, то она возвращает не нулевое значение(TRUE).

Если функция вызвана не правильно, то она возвращает 0(FALSE).

Пример:

DWORD FreeBytesAvailable,  

TotalNumberOfBytes,

TotalNumberOfFreeBytes;

BOOL GetDiskFreeSpaceFlag = GetDiskFreeSpaceEx(

"c:\\", // directory name

(PULARGE_INTEGER)&FreeBytesAvailable, // bytes available to caller

(PULARGE_INTEGER)&TotalNumberOfBytes, // bytes on disk

(PULARGE_INTEGER)&TotalNumberOfFreeBytes // free bytes on disk

);

 

if(GetDiskFreeSpaceFlag != 0)

{

cout<<"Total Number Of Free Bytes = "<<(unsigned long)                 

TotalNumberOfFreeBytes

<<"( "<< double(unsigned long(TotalNumberOfFreeBytes))/(1024*1024)

<< " Mb )" << endl;

cout << "Total Number Of Bytes = " << (unsigned long)TotalNumberOfBytes

<< "( " << double(unsigned long(TotalNumberOfBytes))/(1024*1024)

 << " Mb )" << endl;

}

else cout << "Not Present (GetDiskFreeSpace)" << endl;

 

Функция GlobalMemoryStatus

 

 

Функция GlobalMemoryStatus возвращает информацию об используемой системой памяти.

 

VOID GlobalMemoryStatus(

LPMEMORYSTATUS lpBuffer // указатель на структуру MEMORYSTATUS

);

 

typedef struct _MEMORYSTATUS {

DWORD dwLength;     // длина структуры в байтах

DWORD dwMemoryLoad; // загрузка памяти в процентах

SIZE_T dwTotalPhys; // макс. количество физической памяти в байтах

SIZE_T dwAvailPhys; // свободное количество физической памяти в байтах

SIZE_T dwTotalPageFile; // макс. кол. памяти для программ в байтах

SIZE_T dwAvailPageFile; // свободное кол. памяти для программ в байтах

SIZE_T dwTotalVirtual; // макс. количество виртуальной памяти в байтах

SIZE_T dwAvailVirtual; // объем свободной виртуальной памяти в байтах

} MEMORYSTATUS, *LPMEMORYSTATUS;

 

Возвращаемое значение:

Эта функция не возвращает параметров

 

Пример:

// The MemoryStatus structure is 32 bytes long.

// It should be 32.

// 78 percent of memory is in use.

// There are 65076 total Kbytes of physical memory.

// There are 13756 free Kbytes of physical memory.

// There are 150960 total Kbytes of paging file.

// There are 87816 free Kbytes of paging file.

// There are 1fff80 total Kbytes of virtual memory.

// There are 1fe770 free Kbytes of virtual memory.

 

#define DIV 1024

#define WIDTH 7

char *divisor = "K";

 

MEMORYSTATUS stat;

 

GlobalMemoryStatus (&stat);

 

printf ("The MemoryStatus structure is %ld bytes long.\n",

     stat.dwLength);

printf ("It should be %d.\n", sizeof (stat));

printf ("%ld percent of memory is in use.\n",

     stat.dwMemoryLoad);

printf ("There are %*ld total %sbytes of physical memory.\n",

     WIDTH, stat.dwTotalPhys/DIV, divisor);

printf ("There are %*ld free %sbytes of physical memory.\n",

     WIDTH, stat.dwAvailPhys/DIV, divisor);

printf ("There are %*ld total %sbytes of paging file.\n",

     WIDTH, stat.dwTotalPageFile/DIV, divisor);

printf ("There are %*ld free %sbytes of paging file.\n",

     WIDTH, stat.dwAvailPageFile/DIV, divisor);

printf ("There are %*lx total %sbytes of virtual memory.\n",

     WIDTH, stat.dwTotalVirtual/DIV, divisor);

printf ("There are %*lx free %sbytes of virtual memory.\n",

     WIDTH, stat.dwAvailVirtual/DIV, divisor);

 










Последнее изменение этой страницы: 2018-04-12; просмотров: 454.

stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда...