| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Сколько работало времени |
| Автор: DelphiMaster 18.2.2006, 15:30 |
| Ещё вопрос, а как не задать память приложению, а узнать, сколько точно времени оно работало и сколько динамической памяти заняло. И если можно пример??? |
| Автор: Демо 18.2.2006, 20:58 |
| GetProcessTimes,GetThreadTimes |
| Автор: SoWa 18.2.2006, 21:18 |
| А GetTickCount не будет работать, если взять его в начале программы и в конце. А потом вычесть? |
| Автор: DelphiMaster 19.2.2006, 04:07 |
| У меня программа консольная. И вы правы GetTickCount бессилен он выдаёт не точное время, а приблизительное. Дайте, пожалуйста, пример как использовать функцию GetProcessTimes. |
| Автор: Albinos_x 19.2.2006, 11:58 | ||||
это как - приблизительное? а почему не хочешь сделать как сказал Демо?
|
| Автор: Демо 19.2.2006, 12:36 | ||
Это вряд ли. GetTickCount выдает количество миллисикунд, прошедшее со времени последней загрузки системы. Поэтому приблизительное время GEtTickCount выдавать не может. Другое дело, если у тебя программа работает больше 49,7 дней непрерывно. В этом случае отсчет начинается с нуля. Все же, что тебе нужно? Если вычислить, промежуток времени, в котором работала твоя программа, то см. Albinos_X, если вычислить, сколько процессорного времени заняла программа, тогда см. первый ответ на твой вопрос. |
| Автор: DelphiMaster 20.2.2006, 08:15 |
| Спасибо!!! Сколько динамической памяти заняло!!! Как унать!!! |
| Автор: _hunter 20.2.2006, 11:46 |
| GlobalMemoryStatus |
| Автор: malor 28.7.2011, 16:22 | ||||
Так вот текст strLog: Разница времени: 0 минут 0 секунд 0 милисекунд Запись в файл длится менее одной миллисекунды? Delphi XE
|
| Автор: bems 17.10.2011, 22:45 |
| 1. Действительно может быть меньше, потому что совсем не обязательно происходит реальная запись. Это же буфферизуется 2. Не используй Now. Еспользуй GetProcessTimes/GetThreadTimes |
| Автор: northener 17.10.2011, 23:28 |
Для определения не очень больших интервалов времени всегда предпочитал использовать QueryPerformanceCounter. С GetProcessTimes/GetThreadTimes не работал. Есть уверенность, что эти функции действительно дадут обещанную в хелпе точность? |
| Автор: bems 18.10.2011, 00:22 | ||
http://www.transl-gunsmoker.ru/2010/11/blog-post_15.html Нет уверенности. Но можно сделать побольше итераций и таким образом решить эту проблему. А QueryPerformanceCounter, как и Now, как и GetTickCount бессильны в случаях когда в середине измеряемого интервала активизируетсмя какой-нить другой тред и начинает делать что-то тяжелое |
| Автор: northener 18.10.2011, 00:53 | ||
Обоснуй! Про Now и GetTickCount я не спрашиваю. Только про QueryPerformanceCounter. |
| Автор: bems 18.10.2011, 02:20 | ||||
ну прогони вот такую прогу и посмотри на результат
у меня она выдала
Видно что результат прямопропорционален задержке в Sleep. Известно что эта функция делает вызвавший тред не планируемым как минимум на указанный интервал (ну есть неточность связанная с частотой таймера, но это в данном случае не важно). Большинство этого времени тред не выполняется. Представь что там не Sleep, а код, который ты пытаешься так профайлить. В середине этого кода, на на том же логическом процессоре начинает выполняться чужой поток (тз-за конца кванта времени отпущенного твоему потоку, или это высокоприоритетный поток и он вытесняет твой на этом основании). И QueryPerformanceCounter как ни в чем не бывало вернет тебе время, включающее выполнение чужого потока. |
| Автор: northener 18.10.2011, 02:39 | ||
Наверно мы говорим о разном. Ты уж тогда приведи пример использования функций GetProcessTimes/GetThreadTimes в тех же условиях. А я уж сравню результаты. P.S. Но "логгирование" тут уж никак ни при чём. |
| Автор: bems 18.10.2011, 02:45 | ||
Сейчас А где о нем шла речь? |
| Автор: northener 18.10.2011, 02:52 |
В "некромантском " посте от 28.7.2011, 16:22 на который вы "поспешили ответить" 17.10.2011, 22:45 |
| Автор: bems 18.10.2011, 03:05 | ||||
Как-то так
результат:
видим что в случае Sleep никакого выполнения не фиксируется, а в случае задержки циклом - фиксируется время, грубо пропорциональное времени задержки. То что грубо вина не только GetThreadTimes а еще и GetTickCount который тут постольку поскольку. Добавлено через 1 минуту и 42 секунды даже не представляю как я тут оказался |
| Автор: northener 18.10.2011, 03:31 | ||
А я ведь не об этом. То что GetTickCount имеет дискретность ~16мс это не секрет. И прямая пропорциональность тоже не волшебство. Я лишь хотел спросить о том, поддерживают ли функции GetProcessTimes/GetThreadTimes обещанную точность в 100 наносекунд? Дело в том, что на предыдущей своей работе столкнулся с тем, что внешнее (и ну очень дорогое железо) никак не хочет принимать команды чаще чем через 16 мс. Но это бы ещё ничего. Но примерно раз через пять, оно принимало и выполняло команды с задержкой в 200-300 мс. Только логгирование с помощью функции QueryPerformanceCounter мне помогло доказать начальству, что то железо, которое они купили за бешеные деньги ни как им не годится. |
| Автор: bems 18.10.2011, 03:51 | ||||
Вот тут ты просил показать что QueryPerformanceCounter не выдерживает условия конкуренции тредов, а GetThreadTimes выдерживает. Я показал. А твой пример со сторонним железом тут вообще не при чем, потому что не идет речь о том сколько же времени выполнялся код твоего процесса/потока, а только когда отреагировало железо. Тут GetThreadTimes не поможет, но недостаток QueryPerformanceCounter остаётся: если твой тред вытеснят, то ты поставишь отметку времени завершения команды позже чем реально ответило железо. |
| Автор: northener 19.10.2011, 00:03 | ||
Ну в данном случае речь как раз шла о времени выполнения моего кода вкупе со временем выполнения функций/процедур, которые непосредственно работают с тем железом. А "те функции/процедуры" мне были даны в некоей/неких dll. P.S. Собственно к железу у меня претензий не было. Дали бы мне "непосредственный" доступ к нему, я скорее всего смог бы с ним справиться так как нужно было заказчику. |
| Автор: bems 19.10.2011, 01:48 |
| Ну собственно выполнение кода замерило бы, да. |
| Автор: Korod 24.10.2011, 12:06 |
| Говорить о точности измерения временных интервалов в Винде - смех! Что GetTick..., что Query..., что в стену - что об стену.. |
| Автор: CROTishka 25.10.2011, 10:04 | ||
а что, профилировщики ещё не посоветовали? лично я с делфи AQtime использую. |