Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сколько работало времени, и использовало памяти приложение? 
:(
    Опции темы
DelphiMaster
Дата 18.2.2006, 15:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ещё вопрос, а как не задать память приложению, а узнать, сколько точно времени оно работало и сколько динамической памяти заняло. И если можно пример??? smile smile smile
PM MAIL   Вверх
Демо
Дата 18.2.2006, 20:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(DelphiMaster @ 18.2.2006, 15:30 Найти цитируемый пост)
сколько точно времени оно работало


GetProcessTimes,GetThreadTimes


--------------------
    
PM MAIL ICQ Skype   Вверх
SoWa
Дата 18.2.2006, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Харекришна
****


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

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



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


--------------------
Всем добра smile
PM MAIL ICQ   Вверх
Демо
Дата 18.2.2006, 22:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(SoWa @ 18.2.2006, 21:18 Найти цитируемый пост)
А GetTickCount не будет работать, если взять его в начале программы и в конце. А потом вычесть?


Не хочется думать, что автор не понимает, как вычисляются промежутки между двумя точками времени.
Скорее уж его интересует время, которое программа реально работала, а не простаивала.
Добавлено @ 22:35
Добавлю, что GetTickCount не поможет. Скорее уж просто Now в начале и в нужный момент времени.

У меня есть программы, которые работают месяцами. Тут GetTickCount бессилен.



--------------------
    
PM MAIL ICQ Skype   Вверх
DelphiMaster
Дата 19.2.2006, 04:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



У меня программа консольная. И вы правы GetTickCount бессилен он выдаёт не точное время, а приблизительное. Дайте, пожалуйста, пример как использовать функцию GetProcessTimes. smile
PM MAIL   Вверх
Albinos_x
Дата 19.2.2006, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Evil Skynet
****


Профиль
Группа: Комодератор
Сообщений: 3288
Регистрация: 28.5.2004
Где: X-6120400 Y-1 4624650

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



Цитата(DelphiMaster @ 19.2.2006, 04:07 Найти цитируемый пост)
И вы правы GetTickCount бессилен он выдаёт не точное время, а приблизительное

это как - приблизительное?

а почему не хочешь сделать как сказал Демо?
Код
...
var D:TDateTime;
    yy,mm,dd,hh,min,sec,msec:Word;
    S:String;
...
begin
d:=now;
...
d:=now-d;
DecodeDateTime(d,yy,mm,dd,hh,min,sec,msec);
s:='Функция работала '+inttostr(yy)+' лет '+inttostr(mm)+' месяцев '+inttostr(dd)+' дней '+inttostr(hh)+' часов '+inttostr(min)+' минут '+inttostr(sec)+' секунд '+inttostr(msec)+' милисекунд ';
...



--------------------
"Кто владеет информацией, тот владеет миром"    
Уинстон Черчилль
PM MAIL ICQ   Вверх
Демо
Дата 19.2.2006, 12:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(DelphiMaster @ 19.2.2006, 04:07 Найти цитируемый пост)
У меня программа консольная. И вы правы GetTickCount бессилен он выдаёт не точное время, а приблизительное


Это вряд ли. GetTickCount выдает количество миллисикунд, прошедшее со времени последней загрузки системы. Поэтому приблизительное время GEtTickCount выдавать не может. Другое дело, если у тебя программа работает больше 49,7 дней непрерывно. В этом случае отсчет начинается с нуля.

Все же, что тебе нужно?
Если вычислить, промежуток времени, в котором работала твоя программа, то см. Albinos_X, если вычислить, сколько процессорного времени заняла программа, тогда см. первый ответ на твой вопрос.

Это сообщение отредактировал(а) Демо - 19.2.2006, 12:37


--------------------
    
PM MAIL ICQ Skype   Вверх
DelphiMaster
Дата 20.2.2006, 08:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо!!! smile
Сколько динамической памяти заняло!!! Как унать!!! smile smile smile
PM MAIL   Вверх
_hunter
Дата 20.2.2006, 11:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 8564
Регистрация: 24.6.2003
Где: Europe::Ukraine:: Kiev

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



GlobalMemoryStatus


--------------------
Tempora mutantur, et nos mutamur in illis...
PM ICQ   Вверх
malor
  Дата 28.7.2011, 16:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Код
D: = Now;
Функция в этом месте пишет строку из десятка цифр в текстовой файл
D := Now - d;
DecodeDateTime(D, yy, mm, dd, hh, min, sec, msec);
strLog := 'Разница времени: ' + IntToStr(min) + ' минут ' + IntToStr(sec) + ' секунд ' + IntToStr(msec) + ' милисекунд ';


Так вот текст strLog:
Разница времени: 0 минут 0 секунд 0 милисекунд 

Запись в файл длится менее одной миллисекунды?

Delphi XE
Цитата
CPU Type   DualCore Intel Pentium E2180, 2000 MHz (10 x 200)  
Motherboard Name   Gigabyte GA-P31-ES3G (3 PCI, 3 PCI-E x1, 1 PCI-E x16, 2 DDR2 DIMM, Audio, Gigabit LAN)  
Motherboard Chipset   Intel Bearlake P31  
System Memory   3328 MB (DDR2-800 DDR2 SDRAM)  
DIMM1: Hynix HYMP125U64CP8-S5   
2 GB DDR2-800 DDR2 SDRAM (5-5-5-18 @ 400 MHz) (4-4-4-12 @ 266 MHz) (3-3-3-9 @ 200 MHz)  
DIMM3: Samsung M3 78T5663RZ3-CF7
2 GB DDR2-800 DDR2 SDRAM (6-6-6-18 @ 400 MHz) (5-5-5-15 @ 333 MHz) (4-4-4-12 @ 266 MHz)    


Это сообщение отредактировал(а) malor - 28.7.2011, 16:23
PM MAIL   Вверх
bems
Дата 17.10.2011, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



1. Действительно может быть меньше, потому что совсем не обязательно происходит реальная запись. Это же буфферизуется
2. Не используй Now. Еспользуй GetProcessTimes/GetThreadTimes


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 17.10.2011, 23:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bems @  17.10.2011,  22:45 Найти цитируемый пост)
2. Не используй Now. Еспользуй GetProcessTimes/GetThreadTimes 

Для определения не очень больших интервалов времени всегда предпочитал использовать QueryPerformanceCounter. С GetProcessTimes/GetThreadTimes не работал. Есть уверенность, что эти функции действительно дадут обещанную в хелпе точность?


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 18.10.2011, 00:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(northener @  17.10.2011,  23:28 Найти цитируемый пост)
Есть уверенность, что эти функции действительно дадут обещанную в хелпе точность? 

Точность - не то же самое, что аккуратность Нет уверенности. Но можно сделать побольше итераций и таким образом решить эту проблему.

А QueryPerformanceCounter, как и Now, как и GetTickCount бессильны в случаях когда в середине измеряемого интервала активизируетсмя какой-нить другой тред и начинает делать что-то тяжелое


--------------------
Обижено школьников: 8
PM MAIL   Вверх
northener
Дата 18.10.2011, 00:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(bems @  18.10.2011,  00:22 Найти цитируемый пост)
А QueryPerformanceCounter, как и Now, как и GetTickCount бессильны в случаях когда в середине измеряемого интервала активизируетсмя какой-нить другой тред и начинает делать что-то тяжелое 

Обоснуй! Про Now и GetTickCount я не спрашиваю. Только про QueryPerformanceCounter.


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
bems
Дата 18.10.2011, 02:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



ну прогони вот такую прогу и посмотри на результат
Код

program Project3;
{$APPTYPE CONSOLE}
uses
  windows, sysutils;

  procedure WriteInterval(ms: DWORD);
  var
    c1, c2: Int64;
  begin
    if not QueryPerformanceCounter(c1) then RaiseLastOsError;
    sleep(ms);
    if not QueryPerformanceCounter(c2) then RaiseLastOsError;
    writeln(c2 - c1);
  end;

begin
  WriteInterval(500);
  WriteInterval(1000);
  WriteInterval(2000);
  WriteInterval(5000);
  readln
end.


у меня она выдала
Цитата
1463520
2928468
5858403
14648058

Видно что результат прямопропорционален задержке в Sleep. Известно что эта функция делает вызвавший тред не планируемым как минимум на указанный интервал (ну есть неточность связанная с частотой таймера, но это в данном случае не важно). Большинство этого времени тред не выполняется. 
Представь что там не Sleep, а код, который ты пытаешься так профайлить. В середине этого кода, на на том же логическом процессоре начинает выполняться чужой поток (тз-за конца кванта времени отпущенного твоему потоку, или это высокоприоритетный поток и он вытесняет твой на этом основании). 
И QueryPerformanceCounter как ни в чем не бывало вернет тебе время, включающее выполнение чужого потока.


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

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


 




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


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

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