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


Автор: 46&two 21.4.2004, 19:25
дело так:

есть функция myfunction();
я хочу как можно более точно рассчитать время ее работы (имеется в виду, чистое время процесса)
чем больше будет знаков после запятой, тем лучше

я сейчас делаю так:
Код
clock_t begin, end;

begin = clock();
myfunction();
end = clock();
cout << (end-begin)/CLOCKS_PER_SEC;


Можно ли точнее считать время????

Автор: Leopard25 21.4.2004, 20:44
s1=GetTickCount();

//функция

s2=GetTickCount();

s4=(s2-s1);

Автор: Coocky 21.4.2004, 21:28
В С++ есть функция подсчитывающая кол-во тактов процессора.Ща не помню,но напишу позже smile.gif

Автор: Artiom 21.4.2004, 23:25
Цитата
В С++ есть функция подсчитывающая кол-во тактов процессора

Разве это не есть clock()?

Автор: 46&two 22.4.2004, 16:21
ну так что получается?
что clock() - это наиболее точный вариант?

Автор: Leopard25 22.4.2004, 16:35
Через GetTickCount() получаешь результат в милисекундах.
Тебе нужно ещё точнее ?

Автор: 46&two 22.4.2004, 17:43
конечно точнее. сотые секунды - это слишком большое зерно. ну не повторять же численный метод сто раз, особенно если его временная оценка ~O(n*n).....
тут даже тысячные - вообще говоря, не дело

Автор: Leopard25 22.4.2004, 17:59
Вообщето мили секунды это тысячные ....

Автор: Дрон 22.4.2004, 19:15
Если пишешь для Windows, то как я уже много раз говорил:
Код
BOOL QueryPerformanceCounter(
   LARGE_INTEGER *lpPerformanceCount  // address of current counter value
);

совместно с
Код
BOOL QueryPerformanceFrequency(
   LARGE_INTEGER *lpFrequency  // address of current frequency
);

Дадут ИМХО лучший результат.
Добавлено @ 19:25
Вот как это можно сделать:
Код
    LARGE_INTEGER a,b,f;
    double ElapsedTime;

    QueryPerformanceFrequency(&f);

    QueryPerformanceCounter(&a);
    YourFunction();
    QueryPerformanceCounter(&b);
    ElapsedTime = (double)(b.QuadPart - a.QuadPart)/f.QuadPart;

ElapsedTime будет в секундах. Как я понял, у меня точность ~1/3500000 секунды.

Автор: Novich 23.4.2004, 12:40
GetTickCount() не всегда дает точное значение

Автор: Goremika 23.4.2004, 17:41
Конечно не совсем в тему, но может функцию запускать не один раз а несколько а потом получивщееся время делить на кол-во вызовов ф-ии?

Автор: _hunter 23.4.2004, 19:03
Цитата
конечно точнее. сотые секунды - это слишком большое зерно. ну не повторять же численный метод сто раз, особенно если его временная оценка ~O(n*n).....
тут даже тысячные - вообще говоря, не дело


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


по-моему именно об этом и написанно

Автор: Дрон 23.4.2004, 20:28
Кстати, в Виндах заниматься измерением времени работы с большой точностью -- плохая затея. Они ж многозадачные и всё такое.
Для лучших результатов нужно поставить класс приоритета для процесса -- Realtime (реального времени).

Автор: 46&two 26.4.2004, 10:57
to Dron:
Я прогнал сравнение для твоего метода измерения скорости и с тем, что использовал раньше.
В чем я не уверен: в том что QueryPerformanceCounter считает строго время процесса, а не полное время работы (т.е. с учетом времени, затраченного другими процессами).
Просто сравнение показало, что, например, метод, отрабатывающий за 7 секунд, оцениваетсяQueryPerformanceCounter и сlock() c разницей в ~0.05 секунды. При этом время, рассчитанное QueryPerformanceCounter всегда немного больше времени, рассчитанного cloсk().
Не ахти как много, но все же существенно, особенно если принять во внимание то, что разница в подсчетах clock() и getTickCount() составляет не более 0.001 секунды. вот такие пироги.

Автор: Дрон 26.4.2004, 18:14
QueryPerformanceCounter считает именно полное время.
Я просто не внимательно прочитал вопрос... hehe.gif

А для времени данного процесса есть функция (по названию догадаться можно):
Код
BOOL GetProcessTimes(
 HANDLE hProcess, // specifies the process of interest
 LPFILETIME lpCreationTime, // when the process was created
 LPFILETIME lpExitTime,     // when the process exited
 LPFILETIME lpKernelTime,   // time the process has spent in kernel mode
 LPFILETIME lpUserTime // time the process has spent in user mode
);

Какой именно параметр тебе нужен решай сам.
Дальше переведёшь время его в другой формат при помощи
Код
BOOL FileTimeToSystemTime(
 CONST FILETIME *lpFileTime, // pointer to file time to convert
 LPSYSTEMTIME lpSystemTime  // pointer to structure to receive system time  
);

Точность 100-наносекунд. cool.gif

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