Форум программистов, компьютерный форум, киберфорум
Delphi
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/64: Рейтинг темы: голосов - 64, средняя оценка - 4.83
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
1

Засечь время с точностью в миллисекунду

13.07.2012, 12:52. Показов 12189. Ответов 11
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Необходимо отметить две временные точки и вычислить разницу между ними в миллисекундах.
Разница может быть от 20 мс и выше, так что необходима очень быстрая функция.

Что рассмотрел:

Get{Local,System}Time - Здорово, но возвращает результат в _SYSTEMTIME, который есть структура и просто так разницу в миллисекундах в нем не вычислишь.

Now - Круто, возвращает результат в Double (что в принципе ересь, но ладно) - но долго работает, ибо в своих кишках имеет GetLocalTime и перевод в цикле из _SYSTEMTIME в Double.

GetTickCount - Зависит от частоты процессора. И даже, если её знать теоретически она может меняться при параметрах энергосбережения.

Есть вообще в Delphi нормальные способы засекать время быстро и точно?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.07.2012, 12:52
Ответы с готовыми решениями:

Нужно засечь время выполнения процедуры
писал вот код form1.timer.enabled:=true; search; form1.timer.enabled:=false;Код таймера...

Клик мышки в заданное время с точностью миллисекундах
Пожалуйста, у меня просьба добрым программистам: Нужен мини программка с расширением "swf" или типо...

Засечь время от начала одной операции до окончания другой
Такая задача- допустим юзер открывает файл, текстовый, который потом выводится в TMemo, нужно...

Измерить время с точностью до сотой секунды без API
Доброго времени суток глубокоуважаемые форумчане. Задача однозначна, распространёна и проста....

11
Puporev
13.07.2012, 12:57
  #2

Не по теме:

Цитата Сообщение от Sophos Посмотреть сообщение
Засечь время с точностью в миллисекунду
Цитата Сообщение от Sophos Посмотреть сообщение
Есть вообще в Delphi нормальные способы засекать время быстро и точно?
Если бы было, то это бы было не Делфи, а атомные часы...

0
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 12:59  [ТС] 3
Цитата Сообщение от Puporev Посмотреть сообщение
Если бы было, то это бы было не Делфи, а атомные часы...
Это почему вдруг? Приведенные мною выше способы позволяют получить точность в миллисекунду, но не подходят по другим причинам.
0
Почетный модератор
64300 / 47595 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
13.07.2012, 13:05 4
Цитата Сообщение от Sophos Посмотреть сообщение
позволяют получить точность в миллисекунду
А Вы уверены что то что получается есть 1 млс?
0
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:07  [ТС] 5
Цитата Сообщение от Puporev Посмотреть сообщение
А Вы уверены что то что получается есть 1 млс?
Не уверен, но в точность интервала 20 мс укладывается.
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
13.07.2012, 13:18 6
timeGetTime
0
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:43  [ТС] 7
Цитата Сообщение от murderer Посмотреть сообщение
timeGetTime
Спасибо, но разрешение у него какое? Соответствует lpTimeIncrement из GetSystemTimeAdjustment?
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
13.07.2012, 13:55 8
Там же написано
You can use the timeBeginPeriod and timeEndPeriod functions to increase the precision of timeGetTime.
0
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:57  [ТС] 9
Цитата Сообщение от murderer Посмотреть сообщение
You can use the timeBeginPeriod and timeEndPeriod functions to increase the precision of timeGetTime.
Мне такое не подойдет. Процесс, который будет делать отметки будет крутиться в фоне постоянно, а отдавать при этом большое количество ресурсов процессора и памяти только на то, чтобы повысить точность на 1-2 мс нецелесообразно.
0
4165 / 1817 / 216
Регистрация: 06.10.2010
Сообщений: 4,074
13.07.2012, 14:08 10
Кажется ещё так можно
Delphi
1
milliseconds:=QueryPerformanceCounter/QueryPerformanceFrequency*0,001;
А про
Зависит от частоты процессора. И даже, если её знать теоретически она может меняться при параметрах энергосбережения.
MSDN отвечает
The frequency cannot change while the system is running.
Добавлено через 3 минуты
Сейчас заметил, что QueryPerformanceFrequency - это процедура. Ну короче ты понял идею.
0
88 / 65 / 2
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 14:32  [ТС] 11
Цитата Сообщение от murderer Посмотреть сообщение
QueryPerformanceCounter
Идея не очень. Её "качество" отличается на разных операционках, процессорах, режимах работы: http://www.virtualdub.org/blog... php?id=106
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
13.07.2012, 17:15 12
Показания QueryPerformanceFrequency() всё-таки могут плавать при переходе процессора между различными режимами энергопотребления. Хотя Микрософт и утверждает обратное. Особенно это касается ноутбуков. Эта тема на разных форумах обсуждалась.
---
Пример применения QueryPerformanceFrequency() и QueryPerformanceCounter() :
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.Button1Click(Sender: TObject);
var
  i : Integer;
  Fr, t1, t2 : Int64;
  Dt : Extended;
begin
  //Определяем тактовую частоту процессора (количество тактов в секунду).
  QueryPerformanceFrequency(Fr);
  if Fr = 0 then begin
    ShowMessage('Не удалось получить сведения о тактовой частоте.');
    Exit;
  end;
  ShowMessage('Тактовая частота процессора (количество тактов в секунду): ' + IntToStr(Fr));
 
  //Чтение показания счётчика тактов.
  QueryPerformanceCounter(t1);
 
  //Запуск исследуемого процесса.
  Sleep(5);
 
  //Показание счётчика тактов.
  QueryPerformanceCounter(t2);
  //Рассчёт времени.
  Dt := (t2 - t1) / Fr;
 
  ShowMessage('Длительность выполнения в секундах: ' + FloatToStr(Dt));
end;
---
Можно воспользоваться методом, который предложил murderer - с применением timeBeginPeriod() - timeGetTime() - timeEndPeriod().
0
13.07.2012, 17:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.07.2012, 17:15
Помогаю со студенческими работами здесь

Засечь время
Как засечь время за которое выполняется процедура, или время выполнения алгоритма?

Засечь время работы метода
Сделал метод в wolphram matematica 8.0 теперь преподаватель попросил сделать так чтобы выводилось...

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

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru