Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Как узнать время работы пограммы?


Автор: HMLd 29.6.2006, 01:31
Как узнать время выполнения программы?...Я что-то слышал про 046Ch...
Можно пример?...Или линк на статью...smile 

Автор: Kostt 29.6.2006, 07:28
ОС какая? 

Автор: chaos 29.6.2006, 07:42
вот тебе пример(тоже однажды решил фигней пострадать - позамерять)

Код

#define WIN32_LEAN_AND_MEAN  /* speed up compilations */ 
#include <windows.h> 
#include <stdlib.h> 
#include <stdio.h> 

#define ARRSIZE 150000 

__int64 FileTimeToQuadWord(PFILETIME pft) 
{ 
   return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime); 
} 

ULONG Thread(LPVOID lpData) 
{ 
   FILETIME ftCreationTime1, ftCreationTime2; 
   FILETIME ftExitTime1, ftExitTime2; 
   FILETIME ftKernelTime1, ftKernelTime2; 
   FILETIME ftUserTime1, ftUserTime2; 
    
   int x; 
   int *lpArray = (int *)malloc(sizeof(int) * ARRSIZE ); 

   //непосредственно начала замеряемого участка 
   GetThreadTimes(GetCurrentThread(), &ftCreationTime1, &ftExitTime1, &ftKernelTime1, &ftUserTime1); 
   for (size_t i = 1; i < ARRSIZE; i++) 
      for(size_t j = ARRSIZE - 1; j >= i; j--) 
           if (lpArray[j - 1] > lpArray[j])     
         { 
               x = lpArray[j - 1]; 
                   lpArray[j - 1] = lpArray[j]; 
            lpArray[j] = x; 
             } 
   GetThreadTimes(GetCurrentThread(), &ftCreationTime2, &ftExitTime2, &ftKernelTime2, &ftUserTime2); 
   //конец
   free(lpArray); 

   __int64 m_qwKernelTimeElapsed, m_qwUserTimeElapsed; 
   m_qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTime2) - FileTimeToQuadWord(&ftKernelTime1); 
   m_qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTime2) - FileTimeToQuadWord(&ftUserTime1); 
   double m_qwTotalTimeElapsed = (m_qwKernelTimeElapsed + m_qwUserTimeElapsed) / 1E7; 


   char szResult[20] = {0}; 
   sprintf(szResult, "%7.3f", m_qwTotalTimeElapsed); 
   MessageBox(NULL, szResult, "Result", MB_OK); 

   return 0; 
} 

int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) 
{ 

   DWORD dwThreadId; 
   HANDLE hThread1 = CreateThread(NULL, 0, Thread, NULL, 0, &dwThreadId); 
   HANDLE hThread2 = CreateThread(NULL, 0, Thread, NULL, 0, &dwThreadId); 
   HANDLE hThread3 = CreateThread(NULL, 0, Thread, NULL, 0, &dwThreadId); 

   HANDLE lpHandles[3]; 
   lpHandles[0] = hThread1; 
   lpHandles[1] = hThread2; 
   lpHandles[2] = hThread3; 
   WaitForMultipleObjects(3, lpHandles, TRUE, INFINITE); 

   CloseHandle(hThread1); 
   CloseHandle(hThread2); 
   CloseHandle(hThread3); 

   return 0; 
} 

 

Автор: MAKCim 29.6.2006, 08:55
если *ix
можешь команду shell times использовать
# times <твоя программа>
еще достаточно точный способ через clock 

Автор: NiJazz 29.6.2006, 10:25
Если под винду, то не надо таких ивзратов. Есть GetTickCount. Эта функция показывает, сколько миллисекунд прошло после старта системы (с какого-то там момента). Можно запомнить значение в начале работы алгоритма/программы и затем вычесть это значение от результата функции в конце.
Если не винда, то скорее всего clock. Linux, к примеру, вообще в плане API небогат. smile 

Автор: MAKCim 29.6.2006, 10:29
Цитата

к примеру, вообще в плане API небогат.

и это его преимущество 

Автор: NiJazz 29.6.2006, 10:35
Не преимущество, а дубовизна скорее. Там до сих пор синхронизуются с помощью файлов?  smile  

Автор: MAKCim 29.6.2006, 10:53
Цитата

Не преимущество, а дубовизна скорее

Цитата

...
Философия Win32 API полностью отлична от философии UNIX. В ОС UNIX все системные вызовы опубликованы и формируют минимальный интерфейс: удаление одного из них приведет к снижению функциональности ОС. Философия Win32 заключается в предоставлении всеобъемлющего интерфейса, часто с возможностью выполнить одно и то же тремя или четырьмя способами, включающего множество функций
...
 

Автор: HMLd 29.6.2006, 12:11
Цитата
ОС какая? 

Винда...

Цитата
GetTickCount

Надо попробовать заюзать... smile 

Автор: chaos 29.6.2006, 12:57
Цитата(NiJazz @ 29.6.2006,  10:25)
Можно запомнить значение в начале работы алгоритма/программы и затем вычесть это значение от результата функции в конце.

винда "многозадачная" система так что в твои расчеты может попасть лишнее время.
лучше GetThreadTimes "не придумать" smile 

Автор: SergeCpp 29.6.2006, 13:12
http://forum.vingrad.ru/index.php?showtopic=92318 

Автор: Xenon 29.6.2006, 13:40
 А при помощие макроса _TIME_ нельзя? Использовать его как точку отсчета. Время начала обработки текущего файла ... 

Автор: dumb 29.6.2006, 14:23
Цитата(XenonSk @  29.6.2006,  13:40 Найти цитируемый пост)
 А при помощие макроса _TIME_ нельзя? Использовать его как точку отсчета. Время начала обработки текущего файла

интересная тема - подсчитывать время, прошедшее с момента компиляции...
можно еще мух на балконе посчитать smile 

Автор: Xenon 29.6.2006, 16:44
dumb Хм, просто в книжке было "обработка файла". Я не очень понял о чем они: о компиляции, или запуске ... 

Автор: MAKCim 29.6.2006, 16:45
Цитата

А при помощие макроса _TIME_ нельзя? 

начало/конец компиляции ?  smile  

Автор: NiJazz 29.6.2006, 16:49
Цитата

начало/конец компиляции ? 

Макрос __TIME__ заменяется на текущее время при выполнении кода. Это трассировочный макрос и является, кажется, строкой, для этих целей он не подходит. 

Автор: Xenon 29.6.2006, 17:17
MAKCim, ну я типа думал, что это время запуска приложения smile А потом можно получать время работы приложения вычитанием из текущего время это время _TIME_ smile  

Автор: maxim1000 29.6.2006, 18:48
Цитата(NiJazz @  29.6.2006,  15:49 Найти цитируемый пост)
Макрос __TIME__ заменяется на текущее время при выполнении кода

при выполнении кода понятия макрос не существует
оно есть только на этапе разработки/компиляции (даже не линковки) 

Автор: SergeCpp 30.6.2006, 07:44
MSDN

__TIME__ The most recent compilation time of the current source file. The time is a string literal of the form hh:mm:ss.  

Автор: MAKCim 30.6.2006, 09:29
Цитата

оно есть только на этапе разработки/компиляции 

я бы даже сказал на этапе препроцессирования  smile  

Автор: Xenon 30.6.2006, 11:28
Но если нужно узнать время работы программы, то почему бы в самом ее начале не воткнуть цикл-счетчик и все? Или я не совсем так понял задачу ... 

Автор: SergeCpp 30.6.2006, 11:56
В Вашем решении считается время всех процессов... 

Автор: MAKCim 30.6.2006, 11:57
Цитата

Но если нужно узнать время работы программы, то почему бы в самом ее начале не воткнуть цикл-счетчик и все?

а процессорное время на работу со счетчиком? 

Автор: Xenon 30.6.2006, 15:04
MAKCim, а что нужно сделать точкой отсчета? smile Который шаг. Клик по экзешнику, полная загрука приложения. Что? smile 

Автор: MAKCim 30.6.2006, 17:08
Цитата

а что нужно сделать точкой отсчета? smile Который шаг. Клик по экзешнику, полная загрука приложения. Что?

передачу управления функции main
потому как при клике по экзешнику выполняется еще куча всего, что прямо не относится к программе 

Автор: EvgenZ 13.8.2006, 23:18
А как узнать время "компьютера" и чтобы оно все время проверялось? Чтобы при запуске программы она получала время и через определенный период сравнивала время программы и системное время.

Автор: codelord 14.8.2006, 02:11
Цитата(EvgenZ @  13.8.2006,  19:18 Найти цитируемый пост)
А как узнать время "компьютера" и чтобы оно все время проверялось? Чтобы при запуске программы она получала время и через определенный период сравнивала время программы и системное время. 

systime n;
GetLocalTime(&n);
....
можно и

GetSystemTime(&n);
...
а чтобы сравнить можно и самому поразмышлять это даже интересно  smile.

Автор: EvgenZ 14.8.2006, 12:27
Что-то не понятно  smile  если возможно.

Сравнение согласен, можно и самому придумать без проблемм  smile .

Автор: EvgenZ 15.8.2006, 10:50
Код

int main(){
   time_t system_time= time(NULL);
   std::cout << "Time " << ctime(&system_time) << std::endl;
}


а как это можно обрабатывать? Например мне нужно только минуты и секунды, как мне их "переприсвоить" своему классу ?

Автор: Mayk 15.8.2006, 11:18
Цитата(EvgenZ @  15.8.2006,  14:50 Найти цитируемый пост)

а как это можно обрабатывать? Например мне нужно только минуты и секунды, как мне их "переприсвоить" своему классу ? 

зачем тебе текущее время в строковом виде?
Лучше как выше говорят, используй clock(ибо портируемо и достаточно точно)
Код

int main(){
    clock_t clk = clock(); //текущее время
    .... что-то страшное ...
    clk = clock() - clk; //разница во времени
    double timeInSeconds = ((double) clk)/CLOCKS_PER_SEC;
    cout << timeInSeconds << endl;
}

Автор: EvgenZ 15.8.2006, 11:24
 если не ошибаюсь, функция clock() возвращает целочисленное значение типа clock_t – это время, прошедшее с момента запуска программы. а мне нужно системное время ящика  smile , или я чего-то не понимаю  smile 

Автор: Dragon 15.8.2006, 13:10
Цитата

Не преимущество, а дубовизна скорее. Там до сих пор синхронизуются с помощью файлов?    

Имеешь в виду обмен данными между процессами? Есть функция mmap - от memory map, которая с опциями MAP_SHARED | MAP_ANONYMOUS не создает backend файла.

Кроме того, расширение понятия файловой системы, например /proc - это плюс, а не минус - т.к. эти "файлы" только отображаются как часть файловой системы, на самом деле их там и не существует. Это унификация доступа к информации.

По сабжу:
Код

class ExecutionTimer
{
public:
    ExecutionTimer(bool _autoStart = true) 
    { gettimeofday(&initializationTime, 0);}
    
    timeval ElapsedTime() const
    {
        timeval _currentTime, _elapsedTime; 
        
        gettimeofday(&_currentTime, 0);
        timersub(&_currentTime, &initializationTime, &_elapsedTime);
        
        return _elapsedTime;
    }
    
    inline timeval StartupTime() const { return initializationTime; }

private:
    timeval initializationTime;
};

class SpecificTimer : public ExecutionTimer
{
public:
    ~SpecificTimer()
    {
        timeval elapsedTIme = ElapsedTime();
        using std::extended_string;
        
        extended_string _elapsedTime = extended_string("Execution time: ") + elapsedTIme.tv_sec + '.'
            + std::convert_tostr<6, '0'>(elapsedTIme.tv_usec); _elapsedTime += " seconds...\n";
        
        // Application chouses its own way to show message
        cout<<_elapsedTime<<endl;
    }
};

int main()
{
    SpecificTimer _timer;
    for(std::size_t i = 0;i < 10;i++) usleep(100000);
    
    return 0;
}



Вот общая реализация для Linux - но совсем несложно портировать. ExecutionTimer в принципе дает все необходимое в плане расчета времени. Но для debug целей приложение может создать производный класс с деструктором, выводящим расчитанное время в приемлемой форме - т.е. в консоль, в log файл, хоть MessageBox'ом smile

Т.е. достаточно создать объект в начале расчетного интервала, а по выходе из области видимости по уничтожении объекта автоматически будет отображено время.

Автор: Бор 26.8.2006, 23:18
Цитата

The GetTickCount function retrieves the number of milliseconds that have elapsed since Windows was started. 

DWORD GetTickCount(VOID)
 

Parameters

This function has no parameters. 

Return Values

If the function succeeds, the return value is the number of milliseconds that have elapsed since Windows was started. 

Remarks

The elapsed time is stored as a DWORD value. Therefore, the time will wrap around to zero if Windows is run continuously for 49.7 days. 
Windows NT: To obtain the time elapsed since the computer was started, look up the System Up Time counter in the performance data in the registry key HKEY_PERFORMANCE_DATA. The value returned is an 8 byte value. 


И жизнь покажется раем

 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)