Студопедия КАТЕГОРИИ: АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция |
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, то функция возвращает информацию о текущем каталоге.
Возвращаемое значение: Функция возвращает тип диска. Могут быть следующие значения:
Пример: 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; просмотров: 506. stydopedya.ru не претендует на авторское право материалов, которые вылажены, но предоставляет бесплатный доступ к ним. В случае нарушения авторского права или персональных данных напишите сюда... |