Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 59, средняя оценка - 4.93
Sophos
86 / 63 / 3
Регистрация: 04.01.2010
Сообщений: 265
#1

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

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

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

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

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

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

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

Есть вообще в Delphi нормальные способы засекать время быстро и точно?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.07.2012, 12:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Засечь время с точностью в миллисекунду (Delphi):

График количество-время, где время разбито в несколько полей - Delphi БД
Собсна, есть таблица с полями: День; Час; Минута; Количество; Все числовые. Есть DBChart. Задача заключается в том, чтобы...

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

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

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

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

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

11
Puporev
13.07.2012, 12:57
  #2

Не по теме:

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

0
Sophos
86 / 63 / 3
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 12:59  [ТС] #3
Цитата Сообщение от Puporev Посмотреть сообщение
Если бы было, то это бы было не Делфи, а атомные часы...
Это почему вдруг? Приведенные мною выше способы позволяют получить точность в миллисекунду, но не подходят по другим причинам.
0
Puporev
Модератор
54039 / 41672 / 14753
Регистрация: 18.05.2008
Сообщений: 97,993
13.07.2012, 13:05 #4
Цитата Сообщение от Sophos Посмотреть сообщение
позволяют получить точность в миллисекунду
А Вы уверены что то что получается есть 1 млс?
0
Sophos
86 / 63 / 3
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:07  [ТС] #5
Цитата Сообщение от Puporev Посмотреть сообщение
А Вы уверены что то что получается есть 1 млс?
Не уверен, но в точность интервала 20 мс укладывается.
0
murderer
3572 / 1461 / 82
Регистрация: 06.10.2010
Сообщений: 3,215
13.07.2012, 13:18 #6
timeGetTime
0
Sophos
86 / 63 / 3
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 13:43  [ТС] #7
Цитата Сообщение от murderer Посмотреть сообщение
timeGetTime
Спасибо, но разрешение у него какое? Соответствует lpTimeIncrement из GetSystemTimeAdjustment?
0
murderer
3572 / 1461 / 82
Регистрация: 06.10.2010
Сообщений: 3,215
13.07.2012, 13:55 #8
Там же написано
You can use the timeBeginPeriod and timeEndPeriod functions to increase the precision of timeGetTime.
0
Sophos
86 / 63 / 3
Регистрация: 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
murderer
3572 / 1461 / 82
Регистрация: 06.10.2010
Сообщений: 3,215
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
Sophos
86 / 63 / 3
Регистрация: 04.01.2010
Сообщений: 265
13.07.2012, 14:32  [ТС] #11
Цитата Сообщение от murderer Посмотреть сообщение
QueryPerformanceCounter
Идея не очень. Её "качество" отличается на разных операционках, процессорах, режимах работы: http://www.virtualdub.org/blog/pivot/entry.php?id=106
0
Mawrat
12820 / 5728 / 676
Регистрация: 19.09.2009
Сообщений: 8,807
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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2012, 17:15
Привет! Вот еще темы с ответами:

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

Как засечь время выполнения функции? - C (СИ)
Упражнение 3.1 K&R как новичку без серьезных описаний и дополнений кода засечь время выполнения функции? работаю в QT

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

Засечь время, за которое програма отсортирирует масив. - C#
В общем задача такова: Нужно засечь время, за которое програма отсортирирует масив. И соответвенно вывести в компонент ( textBox)


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru