Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> как наиболее точно считать время??? 
:(
    Опции темы
46&two
Дата 21.4.2004, 19:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



дело так:

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

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

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


Можно ли точнее считать время????
PM MAIL   Вверх
Leopard25
Дата 21.4.2004, 20:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 17.4.2004

Репутация: нет
Всего: нет



s1=GetTickCount();

//функция

s2=GetTickCount();

s4=(s2-s1);
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Coocky
Дата 21.4.2004, 21:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


GUI гуру
****


Профиль
Группа: Участник Клуба
Сообщений: 2879
Регистрация: 16.2.2004
Где: Украина. Запорожь е

Репутация: 2
Всего: 62



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


--------------------
Верю в смерть после жизни, в любовь после секса ,в крем после бритья smile        
PM ICQ   Вверх
Artiom
Дата 21.4.2004, 23:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1031
Регистрация: 11.3.2003
Где: Минск\Баку

Репутация: нет
Всего: 17



Цитата
В С++ есть функция подсчитывающая кол-во тактов процессора

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


--------------------
Если тебя жизнь трахает, значит, ты ещё живой
PM MAIL ICQ   Вверх
46&two
Дата 22.4.2004, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



ну так что получается?
что clock() - это наиболее точный вариант?
PM MAIL   Вверх
Leopard25
Дата 22.4.2004, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 17.4.2004

Репутация: нет
Всего: нет



Через GetTickCount() получаешь результат в милисекундах.
Тебе нужно ещё точнее ?
--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
46&two
Дата 22.4.2004, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



конечно точнее. сотые секунды - это слишком большое зерно. ну не повторять же численный метод сто раз, особенно если его временная оценка ~O(n*n).....
тут даже тысячные - вообще говоря, не дело
PM MAIL   Вверх
Leopard25
Дата 22.4.2004, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 17.4.2004

Репутация: нет
Всего: нет



Вообщето мили секунды это тысячные ....

--------------------
Обдумай, верно ли и возможно ли то, что ты обещаешь, ибо обещание - есть долг. ( Конфуций )
PM MAIL ICQ   Вверх
Дрон
Дата 22.4.2004, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



Если пишешь для 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 секунды.


Это сообщение отредактировал(а) Дрон - 22.4.2004, 19:26


--------------------
Да. Именно так.
PM   Вверх
Novich
Дата 23.4.2004, 12:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 16.4.2004

Репутация: нет
Всего: нет



GetTickCount() не всегда дает точное значение
PM   Вверх
Goremika
Дата 23.4.2004, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 2.4.2004

Репутация: нет
Всего: нет



Конечно не совсем в тему, но может функцию запускать не один раз а несколько а потом получивщееся время делить на кол-во вызовов ф-ии?
PM MAIL   Вверх
_hunter
Дата 23.4.2004, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

Репутация: 16
Всего: 98



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


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


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



--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
Дрон
Дата 23.4.2004, 20:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



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



--------------------
Да. Именно так.
PM   Вверх
46&two
Дата 26.4.2004, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 49
Регистрация: 6.2.2004

Репутация: нет
Всего: нет



to Dron:
Я прогнал сравнение для твоего метода измерения скорости и с тем, что использовал раньше.
В чем я не уверен: в том что QueryPerformanceCounter считает строго время процесса, а не полное время работы (т.е. с учетом времени, затраченного другими процессами).
Просто сравнение показало, что, например, метод, отрабатывающий за 7 секунд, оцениваетсяQueryPerformanceCounter и сlock() c разницей в ~0.05 секунды. При этом время, рассчитанное QueryPerformanceCounter всегда немного больше времени, рассчитанного cloсk().
Не ахти как много, но все же существенно, особенно если принять во внимание то, что разница в подсчетах clock() и getTickCount() составляет не более 0.001 секунды. вот такие пироги.
PM MAIL   Вверх
Дрон
Дата 26.4.2004, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Java-ненавистник :)
****


Профиль
Группа: Участник Клуба
Сообщений: 3179
Регистрация: 29.12.2002
Где: Санкт-Петербург

Репутация: 10
Всего: 93



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


--------------------
Да. Именно так.
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1110 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.