Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Высокоточные часы, точность выше 1 ms 
:(
    Опции темы
CPlusPlusFAN
Дата 26.2.2008, 21:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 315
Регистрация: 1.11.2005
Где: Воронеж

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



Здравствуйте. timeGetTime() возвращает время в милисекундах. Можно ли увеличить точность хотя бы до 0.1 ms, т.е. узнать время в десятых долях милисекунды?
PM MAIL ICQ Jabber   Вверх
PPS05
Дата 26.2.2008, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как вариант: использовать QueryPerformanceCounter (вернет значение высокоточного счетчика) и QueryPerformanceFrequency (частота). Если поделить разность значений счетчиков на частоту, получишь значение временного интервала в микросекундах. Параметры писать не стал - там тривиально LARGE_INTEGER *.


--------------------
Ушел с форума и не вернулся.
PM MAIL ICQ   Вверх
jonie
Дата 28.2.2008, 02:31 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



буду не оригинальным - внешняя система+ос реального времени)


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
MuForum
Дата 19.11.2008, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Цитата(PPS05 @ 26.2.2008,  22:16)
Как вариант: использовать QueryPerformanceCounter (вернет значение высокоточного счетчика) и QueryPerformanceFrequency (частота). Если поделить разность значений счетчиков на частоту, получишь значение временного интервала в микросекундах. Параметры писать не стал - там тривиально LARGE_INTEGER *.

Код

float GetQPTIME(int _Sleep)
{
        float dif = 0;
        LARGE_INTEGER a, b, c;
        //start time
        QueryPerformanceFrequency(&c);
        QueryPerformanceCounter(&a);
        //Do something
        Sleep(_Sleep);
        //end time
        QueryPerformanceCounter(&b);
        dif = ((float)(b.QuadPart - a.QuadPart)/(float)(c.QuadPart));
        // ----
        return dif;
}

- Сделал как ты написал, но к сожалению результат не совсем устраивает...
- Всё равно не совсем чутко работает.
- Может можно ещё как-то увеличить точность в замерах?


P.S. -> Сейчас капаю в сторону Rdtsc
- Отпишусь о результате...


# Добавлено: Выше показанный способ оказался эффективнее других WinApi функций:
Цитата

# GetTickCount(): MSDN; Wiki;
// ----
# TimeGetTime(): MSDN;
# TimeBeginPeriod(): MSDN;
# TimeEndPeriod(): MSDN;
// ----
# Sleep(): MSDN;
// ----
# QueryPerformanceCounter(): MSDN;
# QueryPerformanceFrequency(): MSDN;




Это сообщение отредактировал(а) MuForum - 19.11.2008, 20:51


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
Alexeis
Дата 19.11.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



  Можно на время замера отключить все прерывания, тогда по идее никто не сможет помешать, но винда перестанет быть многозадачной smile .


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
GremlinProg
Дата 19.11.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2706
Регистрация: 9.8.2005
Где: Тюмень

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



Цитата(PPS05 @  27.2.2008,  00:16 Найти цитируемый пост)
Если поделить разность значений счетчиков на частоту, получишь значение временного интервала в микросекундах

Цитата(QueryPerformanceFrequency)

The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.

Syntax
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

Parameters

lpFrequency
[out] Pointer to a variable that receives the current performance-counter frequency, in counts per second. If the installed hardware does not support a high-resolution performance counter, this parameter can be zero. 
Return Value

If the installed hardware supports a high-resolution performance counter, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError. For example, if the installed hardware does not support a high-resolution performance counter, the function fails. 

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

частота дискретизации счетчика зависит от мощей и уровня загруженности проца, вот он и называется performance-counter

основной минус в том, что сам счетчик нестабилен, частота плавает, отсюда небольшие (а порой и большие) погрешности

нужно еще учесть, что на разных процах результат будет скорее разный, чем одинаковый, поэтому во время замеров рекомендуется закреплять процесс или поток на каком-нибудь одном (если, конечно, процов несколько).


--------------------
"Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины."
PM WWW ICQ   Вверх
Kallikanzarid
Дата 21.11.2008, 21:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



MuForum, в документации к DirectX SDK написано, что Rdtsc будет давать некорректные результаты, если изменится частота процессора (например, из-за Cool'n'Quite) или переноса потока на другое ядро. С первым бороться вряд ли удастся, но во избежание второго поток, в котором производится замер, лучше привязать к конкретному ядру с помощью SetProcessorAffinityMask.

Но что-то я повторяю за другими  smile 

Это сообщение отредактировал(а) Kallikanzarid - 21.11.2008, 21:41
PM MAIL   Вверх
MuForum
Дата 25.11.2008, 18:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 427
Регистрация: 13.6.2007
Где: Молдова, Кишинев

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



Цитата(GremlinProg @ 19.11.2008,  20:46)
Цитата(PPS05 @  27.2.2008,  00:16 Найти цитируемый пост)
Если поделить разность значений счетчиков на частоту, получишь значение временного интервала в микросекундах

Цитата(QueryPerformanceFrequency)

The QueryPerformanceFrequency function retrieves the frequency of the high-resolution performance counter, if one exists. The frequency cannot change while the system is running.

Syntax
BOOL QueryPerformanceFrequency(LARGE_INTEGER *lpFrequency);

Parameters

lpFrequency
[out] Pointer to a variable that receives the current performance-counter frequency, in counts per second. If the installed hardware does not support a high-resolution performance counter, this parameter can be zero. 
Return Value

If the installed hardware supports a high-resolution performance counter, the return value is nonzero.

If the function fails, the return value is zero. To get extended error information, call GetLastError. For example, if the installed hardware does not support a high-resolution performance counter, the function fails. 

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

частота дискретизации счетчика зависит от мощей и уровня загруженности проца, вот он и называется performance-counter

основной минус в том, что сам счетчик нестабилен, частота плавает, отсюда небольшие (а порой и большие) погрешности

нужно еще учесть, что на разных процах результат будет скорее разный, чем одинаковый, поэтому во время замеров рекомендуется закреплять процесс или поток на каком-нибудь одном (если, конечно, процов несколько).

Ты оказался прав.
- Даже не трогая ядра, на разных компьютерах разные результаты. (Конфигурация примерно одинаковая)
- Так что данный вариант не годится =(


--------------------
"Чтобы правильно задать вопрос, нужно знать большую часть ответа!" (Р. Шекли)
PM MAIL WWW ICQ Skype MSN   Вверх
jonie
Дата 27.11.2008, 01:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

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



вы все еще не уверовали в мой вариант?) (http://forum.vingrad.ru/index.php?showtopic=198098&view=findpost&p=1427074)

значит вас плохо учили в курсе "Операционные системы"....



--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
allsolovey
Дата 23.2.2009, 17:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



Почему в Borland C 3.1 не работает GetTickCount().Компилируется а вот при запуске ошибка Undefined symbol GETTICKCOUNT in module ..cpp.Windows.h подключен.
PM MAIL   Вверх
GoldFinch
Дата 23.2.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата



****


Профиль
Группа: Завсегдатай
Сообщений: 2141
Регистрация: 30.11.2008

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



говоря о времени в винде надо помнить что это не ОС реального времени. в пределах последовательно квантов времени одного потока время реальное, но по истечению этих квантов поток спит неопределенное время пока снова не получит свои кванты времени

Добавлено через 1 минуту и 9 секунд
гхм... некропост однако


allsolovey, выкинь Borland C 3.1, и вообще - не умеешь настроить свой компилятор  -не берись %)
PM MAIL ICQ   Вверх
allsolovey
Дата 23.2.2009, 18:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Empty



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

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



Я измеряю время работы функции.В билдере время выводит как надо.Что мне в Borland C 3.1 надо настроить?   
PM MAIL   Вверх
Alexeis
Дата 23.2.2009, 19:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(allsolovey @  23.2.2009,  17:00 Найти цитируемый пост)
Я измеряю время работы функции.В билдере время выводит как надо.Что мне в Borland C 3.1 надо настроить?    

 Borland C 3.1 вроде досовский, а функция GetTickCount виндовая.


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

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


 




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


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

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