Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

таймер(счетчик)   Найти похожие ветки 

 
The Vizit0r!   (2004-08-19 17:34) [0]

народ помогите поставить счетчик на процедуру, с целью узнать сколько мили(микро)(1) секунд выполняется сама процедура. ответ желательно кодом(!). обычный не предлагать(слишком неточен)...
set|kill тимер тоже нежелательно... т.к. у меня не считает(не знаю почему)


 
antonn ©   (2004-08-19 17:39) [1]

Две переменных типа TDataTime. Первую засекаешь перед процедурой, вторую сразу после. Из второй вычитаешь первую и получаешь время.

var Data_1,Data_2:TDatetime;
begin
data_1:=time;
//procedure
data_2:=time;
label1.caption:=timetostr(data_2 - data_1);
end;

Хотя это полная хрень...


 
ламер ©   (2004-08-19 17:52) [2]

var
 I: Integer;
begin
 I := GetTickCount;
 proc;
 I := GetTickCount - I;
 ShowMessage(IntToStr(I) + " ms");
end;


 
The Vizit0r!   (2004-08-19 18:03) [3]

А ms - это МИКРО(10^-6)или МИЛИ(10^-3) вроде микро, потому что иначе вроде много но все же?


 
Юрий Зотов ©   (2004-08-19 18:16) [4]

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

Чушь мы получим. Причем такая ситуация вполне реальна и, что еще хуже, непредсказуема.

Тем более мы получим чушь, если будет поочередно активизировано несколькопрограмм, или если сторонняя программа начнет выполнять длительную операцию, установив себе повышенный приоритет. В этом случае результат может быть вообще любым.

Поэтому надо использовать не просто отсечку времени, а отсечку времени исполнения потока - см. GetThreadTimes.


 
ferr ©   (2004-08-19 18:16) [5]

10^-2


 
ferr ©   (2004-08-19 18:17) [6]

Всмысле значение в 10^-3, а реально 10^-2


 
Ls   (2004-08-20 03:33) [7]

Ну насчет милисек инфи полно. А можно ли по тактам процессора посчитать время зная его частоту или время 1-го такта. Тогда таймер точным будет. А перед началом проседуры поставь ей самый высокий приоритет(реального времени). Или функцию напиши а в скобках обьяви переменную процедуры. Результат - время выполнения + сможешь использовать для любой процедуры и писать все время не надо будет.


 
3APA3A ©   (2004-08-20 04:17) [8]

1) Делать потоку RT приоритет - нехорошо...
  2) Ты не можешь посчитать количество тактов затраченное именно на твой поток, т.к. нет гарантии, что он не будет вытеснен другим потоком (см. [4])
  3)Можно использовать GetThreadTimes (опять же см. [4]) или,

  QueryPerformanceFrequency
  QueryPerformanceCounter,

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


 
Германн ©   (2004-08-20 04:50) [9]

2 Юрий Зотов ©   (19.08.04 18:16) [4]
Если я не ошибаюсь, то Вы Юрий - первый, кто предложил использовать GetThreadTimes в вопросах "времени выполнения" процедур. Можете представить пример использования ее в реальной задаче?


 
Jeer ©   (2004-08-20 10:35) [10]

The Vizit0r!   (19.08.04 17:34)  

Для высокоточной оценки относительно непродолжительных участков кода вполне подойдут QueryPerformanceFrequency и QueryPerformanceCounter, основанные на аппаратном таймере.

GetProcessTime и GetThreadTime позволят узнать сколько работали процесс или поток в режимах ядра и пользовательском, а также время создания и завершения.
Квант времени - 100 нс.


 
Юрий Зотов ©   (2004-08-20 15:09) [11]

> Германн ©   (20.08.04 04:50) [9]

Дык... а что ж тут представлять-то? Если все в одном потоке, то сначала вызвали GetThreadTimes ДО исполнения тестируемого кода, а потом вызвали еще раз ПОСЛЕ его исполнения. В итоге получили по две отсечки времени для каждого из режимов, а далее - обычная арифметика.

В одной реальной задаче (точнее, при ее тестировании) я и использовал именно GetThreadTimes. Правда, в моем случае тестируемая задача как раз и работала в своем отдельном потоке, но GetThreadTimes можно использовать и когда поток всего один.


 
Суслик ©   (2004-08-20 15:11) [12]

я в последнее время использую QueryPerformanceCounter


 
3APA3A ©   (2004-08-20 15:13) [13]

//я в последнее время использую QueryPerformanceCounter
 использование QueryPerformanceCounter несколько ограничено из-за [8]


 
Суслик ©   (2004-08-20 15:14) [14]


> 3APA3A ©   (20.08.04 15:13) [13]

именно для высокоточных блоков и применяю.


 
Германн ©   (2004-08-21 03:54) [15]

2 Юрий Зотов ©   (20.08.04 15:09) [11]
Я задавал вопрос, интересуясь параметрами данной функции.

То бишь, а как использовать сию функцию в рамках сабжа? С учетом Вашего замечания:
> но GetThreadTimes можно использовать и когда поток всего один.


 
Юрий Зотов ©   (2004-08-27 07:03) [16]

> Германн ©   (21.08.04 03:54) [15]

Не понимаю я вопроса. Параметры - в справке, первый из них - хэндл потока. Проблем, вроде бы, нет.


procedure TForm1.FormClick(Sender: TObject);
var
 H: THandle;
 CT, ET, KT1, UT1, KT2, UT2: TFileTime;
 KTime1: Int64 absolute KT1;
 UTime1: Int64 absolute UT1;
 KTime2: Int64 absolute KT2;
 UTime2: Int64 absolute UT2;
 i: Integer;
begin
 Caption := "Ждите...";
 H := GetCurrentThread;
 GetThreadTimes(H, CT, ET, KT1, UT1);
 for i := 1 to 1000000 do
 begin
   FloatToStr(Sin(1));
   Application.ProcessMessages
 end;
 GetThreadTimes(H, CT, ET, KT2, UT2);
 Caption := Format("Цикл работал %g секунд.",
   [((KTime2 - KTime1) + (UTime2 - UTime1)) * 1e-7])
end;


 
Verg ©   (2004-08-27 07:27) [17]

Вопрос о точном количестве времени, потраченном на выполнение того или иного кода потоком в ОС с вытесняющей мультизадачтностью (разделение времени) считаю не совсем корректным.
По большому счету, применять ли для измерения GetTickCount, QueryPerformanceCounter с одной стороны или GetThreadTimes с другой, зависит от того для чего будут применены результаты измерений.

Сколько длится хоккейный матч?

1) Вопрос задал хоккеист
2) Вопрос задал телевизионщик



Страницы: 1 вся ветка

Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.49 MB
Время: 0.046 c
1-1093367918
Реактор
2004-08-24 21:18
2004.09.12
Нажатие клавиши Enter


1-1093340465
oleg_SYS
2004-08-24 13:41
2004.09.12
Как перехватить и изменить событие клавиатуры?


11-1080456464
puky
2004-03-28 10:47
2004.09.12
Как перетаскивать иконки в ListView ?


1-1093935824
jenbond
2004-08-31 11:03
2004.09.12
необязательные параметры функции


14-1092155523
Sergey Masloff
2004-08-10 20:32
2004.09.12
Нужно ли бороться с хинтами и ворнингами - 2





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский