Здравствуйте, ToT, Вы писали:
ToT>Здравствуйте, Spaider, Вы писали:
S>>А работать с GetThreadTimes() предельно просто: S>>Вызываешь два раза: в начале метода и в конце, причем CreationTime и ExitTime тебе не нужны. S>>Далее суммируешь разницы для KernelTime и UserTime и получаешь максимально точный результат.
ToT>но как получить результат. Не могу получит разницу при компиляции выдаётся сообщение Operator not applicable to this operand type. Можнт подскажете как нужно её вызывать?
RTFM, TFileTime -- это структура.
ToT>Да и там какаято странная система времени 100 нс затакт как их перевести в мс или сек?
Цитирую help (выделено мной):
Thread kernel mode and user mode times are amounts of time. For example, if a thread has spent one second in kernel mode, this function will fill the FILETIME structure specified by lpKernelTime with a 64-bit value of ten million. That is the number of 100-nanosecond units in one second.
... << RSDN@Home 1.1.3 stable >>
--
К вашим услугам,
Re: Максимально точный способ измерения времени работы проце
Здравствуйте, ToT, Вы писали:
ToT>По заданию нужно провести сравнительный анализ методов сортировки массивов в 200 элементов с последующим увеличением массива на 200 эл. дойти до 8000 элементов. Так вот на больших массивах десятые доли секунд роли не играют, а вот на малых разницы нет. Есть ли наиболее точные способы замера времени работы процедуры, с повышенной точностью.
GetTickCount()
The GetTickCount function retrieves the number of milliseconds that have elapsed since Windows was started.
Re: Максимально точный способ измерения времени работы проце
Тут натолкнулся на такое
"Вычисление время через GetSystemTime не является точным, т.к. во время измерения винда может делать что-то свое, что повлияет на результат. Под WinNT/2K/XP лучше использовать GetThreadTimes (это API-функция, кот. правильно работает под NT-подобными системами, а в 9x показывает полную чушь (вообще, почему она там запускается?)). С ее помощью можно измерить т.н. процессорное время работы программы."
Но с сишными исходниками и API функциями слабовато. Кто-нибудь работал с GetThreadTimes в Delphi? как с ней работать?
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Re[2]: Максимально точный способ измерения времени работы пр
Здравствуйте, ToT, Вы писали:
ToT>Тут натолкнулся на такое ToT>"Вычисление время через GetSystemTime не является точным, т.к. во время измерения винда может делать что-то свое, что повлияет на результат. Под WinNT/2K/XP лучше использовать GetThreadTimes (это API-функция, кот. правильно работает под NT-подобными системами, а в 9x показывает полную чушь (вообще, почему она там запускается?)). С ее помощью можно измерить т.н. процессорное время работы программы." ToT>Но с сишными исходниками и API функциями слабовато. Кто-нибудь работал с GetThreadTimes в Delphi? как с ней работать?
Тебе же сказали, смотри GetTickCount, она просто число возвращает. Описана в windows.pas. Есть еще QueryPerformanceFrequency и QueryPerformanceCounter. Только учти, что если тебе не повезло с компьютером, то они могут вернуть 0
Re[4]: Максимально точный способ измерения времени работы пр
От:
Аноним
Дата:
04.05.04 06:24
Оценка:
Здравствуйте, ToT, Вы писали:
ToT>Здравствуйте, Spaider,
ToT>Всё спасибо разобрался, только всё время разный результат: массив из 80000 элементов сортируется за (вот 10 попыток отсортировать один и тотже массив) 400576,200288,100144,300432,200288,200288,200288,200288,200288,200288 сотен нс (это я вычитал с форумов), но нигде не говорится как их преобразовать в привычное время исчисление!!?
А как граммы в килограммы переводяться знаешь ?
Максимально точный способ измерения времени работы процедуры
По заданию нужно провести сравнительный анализ методов сортировки массивов в 200 элементов с последующим увеличением массива на 200 эл. дойти до 8000 элементов. Так вот на больших массивах десятые доли секунд роли не играют, а вот на малых разницы нет. Есть ли наиболее точные способы замера времени работы процедуры, с повышенной точностью.
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Re[2]: Максимально точный способ измерения времени работы пр
Здравствуйте, ToT, Вы писали:
ToT>Но с сишными исходниками и API функциями слабовато. Кто-нибудь работал с GetThreadTimes в Delphi? как с ней работать?
Господа, задача ясно сформулирована: Максимально точный способ измерения времени...
Так что GetTickCount тут не проканывает, QueryPerformanceCounter -- еще куда ни шло
А работать с GetThreadTimes() предельно просто:
Вызываешь два раза: в начале метода и в конце, причем CreationTime и ExitTime тебе не нужны.
Далее суммируешь разницы для KernelTime и UserTime и получаешь максимально точный результат.
Причем учитывать для простоты можно только младшие два байта из FILETIME (т.е. Int64).
... << RSDN@Home 1.1.3 stable >>
--
К вашим услугам,
Re[3]: Максимально точный способ измерения времени работы пр
Здравствуйте, Romkin, Вы писали:
R>Тебе же сказали, смотри GetTickCount, она просто число возвращает. Описана в windows.pas.
Попробовал GetTickCount Либо лыжи не едут... Постоянно вылетает с ошибкой "Invalid pointer operation"
Может кто скажет в чём у меня ошибка
procedure TForm1.Shellsort(var x: vector; Var s : Longint; N: Integer);
var
h, j, i, r, t, m: integer;
STim, ETim: Longint;
begin
t := round(ln(n) / ln(2)) - 1;
STim := GetTickCount;
Memo1.Lines.Add(IntToStr(STim)); // для контроля считалось или нетfor m := t downto 1 do
begin
h := 0;
for i := 1 to m do
h := 2 * h + 1;
for i := h + 1 to N do
begin
r := x[i]; j := i - h;
while (j >= 1) and (r < x[j]) do
begin
x[j + h] := x[j];
Dec(j, h);
end;
x[j + h] := r
end;
end;
ETim := GetTickCount; <-- в переменную ничего не заносится
Memo1.Lines.Add(IntToStr(ETim)); <-- вылетает здесь, а если убрать да и вообще при компил. след строка игнорируется
s := ETim - STim;
end;
Если взять просто
procedure TForm1.Button1Click(Sender: TObject);
var
STim, ETim, s: Longint;
begin
STim := GetTickCount;
ETim := GetTickCount;
s := ETim - STim;<-- таже история строка просто игнорируется
end;
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Re[4]: Максимально точный способ измерения времени работы пр
Строка не игнорируется, она выносится оптимизатором. Ведь ты присваиваешь локальной переменной s значение, которое потом не испльзуется.
Вставь после присваивания:
ShowMessage(IntToStr(s));
или любую другую фигню, которая бы испльзовала значение переменной s.
А с первым примером какая-то лажа Что значит, в переменную ничего не заносится?
... << RSDN@Home 1.1.3 stable >>
--
К вашим услугам,
Re: Максимально точный способ измерения времени работы проце
От:
Аноним
Дата:
03.05.04 11:13
Оценка:
Почему не довериться профайлерам?
Re[5]: Максимально точный способ измерения времени работы пр
Здравствуйте, Spaider, Вы писали:
S>А с первым примером какая-то лажа Что значит, в переменную ничего не заносится?
Сам понять не могу !!! Когда в первый раз вызываю GetTickCount "STim := GetTickCount;" то в STim данные заносятся, а во второй "ETim := GetTickCount;" либо "0", либо говорит что переменная не определена (просматривал в Watch List'е).
А про переменную s в первом случае? Она ведь используется, возвращается из процедуры в программу "procedure TForm1.Shellsort(... Var s : Longint;...);", она ведь тоже выкидывается компилятором !
А про "Memo1.Lines.Add(IntToStr(ETim));" я так понял проблема с конвертированием переменной в строку , т.к. тоже самое происходит при попытке вывести переменную в любой .Caption (Label, Button, Form...) или Memo
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Re[3]: Максимально точный способ измерения времени работы пр
Здравствуйте, Spaider, Вы писали:
S>А работать с GetThreadTimes() предельно просто: S>Вызываешь два раза: в начале метода и в конце, причем CreationTime и ExitTime тебе не нужны. S>Далее суммируешь разницы для KernelTime и UserTime и получаешь максимально точный результат.
S>Причем учитывать для простоты можно только младшие два байта из FILETIME (т.е. Int64).
У меня чтото не получается полностью обьявить команду. Не подскажете что туда вписать, вернее я вписал (вроде)
но как получить результат. Не могу получит разницу при компиляции выдаётся сообщение Operator not applicable to this operand type. Можнт подскажете как нужно её вызывать?
Да и там какаято странная система времени 100 нс затакт как их перевести в мс или сек?
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Re[3]: Максимально точный способ измерения времени работы пр
Всё спасибо разобрался, только всё время разный результат: массив из 80000 элементов сортируется за (вот 10 попыток отсортировать один и тотже массив) 400576,200288,100144,300432,200288,200288,200288,200288,200288,200288 сотен нс (это я вычитал с форумов), но нигде не говорится как их преобразовать в привычное время исчисление!!?
При работе с QueryPerformanceCounter и QueryPerformanceFrequency как я понял можно получить время вычислив разницу (начала работы процеруры и её окончания) умножить её на 1000000 и разделить на частоту процессора QueryPerformanceFrequency. Может я не прав подскажите как их преобразовывать(GetThreadTimes), в инете я не нашёл, там только, как работать с этими вункциями.
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Re[6]: Максимально точный способ измерения времени работы пр
Здравствуйте, ToT, Вы писали:
ToT> Здравствуйте, Spaider, Вы писали:
S>>А с первым примером какая-то лажа Что значит, в переменную ничего не заносится?
ToT>Сам понять не могу !!! Когда в первый раз вызываю GetTickCount "STim := GetTickCount;" то в STim данные заносятся, а во второй "ETim := GetTickCount;" либо "0", либо говорит что переменная не определена (просматривал в Watch List'е). ToT>А про переменную s в первом случае? Она ведь используется, возвращается из процедуры в программу "procedure TForm1.Shellsort(... Var s : Longint;...);", она ведь тоже выкидывается компилятором !
Я уже в собственном рассудке засомневался Сделал Copy/Paste -- всё работает прекрасно во втором (упрощенном) примере.
... << RSDN@Home 1.1.3 stable >>
--
К вашим услугам,
Re[7]: Максимально точный способ измерения времени работы пр
Здравствуйте, Spaider, Вы писали:
S>Я уже в собственном рассудке засомневался Сделал Copy/Paste -- всё работает прекрасно во втором (упрощенном) примере.
Да я тоже! Ну не важно всё уже заработалло не знаю почему, видимо где-то что-то переписал.
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Спасибо всем кто помог разобраться. Опробовал все три способа.
Считаю, что следует рассказать, что получилось , для тех кто тоже столкнётся с необходимостью заниматься измерением времени работы своего кода.
Исходя из сравнительного анализа можно сделать вывод, что самым не точным, действительно является GetTickCount, особенно если система загружена (например попробовать архивировать много мелких файлов, запустить программу и попробовать несколько раз засечь время).
Спорный вопрос вызывают оставшиеся 2 метода. Если система не загружена всякими программами, то точнее оказывается QueryPerformanceCounter. Но если её загрузить по полной, то она становится не эффективной. Но это всё, как говорится раз на раз не приходится, несколько раз было всё наоборот.
Эффективность я оценивал изходя из того, что, чем меньшее время получилось, тем точнее результат.
Да, кстати если использовать GetThreadTimes совместно со SLEEP, то результат будет нулевой, так как она замеряет время работы самого потока, а SLEEP его останавливает и передаёт работу другим потокам. QueryPerformanceCounter же спокойно продолжает работать т.к. замеряет суммарное время работы всех потоков выполняющихся программой.
Это я получил потестив программку которую быстренько соорудил из тех данных что я получил. Возможно если программку переделать, то получится другой результат (исходники прилагаю http://www.rsdn.ru/File/26046/1.rar).
Да кстати сейчас нашёл проблему : результат становится не точным у того алгоритма который первым запускается в Button1Click. первый из десяти результатов завышен).
Прошу экспертов сильно не критиковать, т.к. я не профи. Я просто хотел рассказать для остальных таких же, как я, то что у меня получилось. Если что-то не так, то пишите я думаю, что тем, кому это пригодится будет интересно в том числе и мне.
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.
Здравствуйте, ToT, Вы писали:
ToT> Спорный вопрос вызывают оставшиеся 2 метода. Если система не загружена всякими программами, то точнее оказывается QueryPerformanceCounter. Но если её загрузить по полной, то она становится не эффективной. Но это всё, как говорится раз на раз не приходится, несколько раз было всё наоборот.
Всё вопросов больше не вызывает QueryPerformanceCounter самый точный способ измерения если в моей тестовой программе размер сортируемого массива уменьшить до 8000-800 элем то остальные способы уже отказываются замерять время в отличии от QueryPerformanceCounter .
... << RSDN@Home 1.1.3 stable >>
Жизнь щедро умудряла его опытом, и на склоне лет он был уже довольно опытным неудачником.