![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Миллисекунды [D6, D7, WinXP]
mishapost © (2004-10-26 23:44:00)Народ надо подсчитать сколько миллисекунд будет обрабатыватся алгоритм сортировки. Как подсчитать эти миллисекунды. Желательно с примером. Спасибо
GuAV (2004-10-27 13:27:00) [1]Этот код под дос.
в дельфи даже не откомпилится.
Jeer (2004-10-27 12:58:00) [2]mishapost (26.10.04 23:44)
Для удовлетворительной точности с использованием GetTickCount
необходимо выполнить осреднение времени выполнения, вызвав
функцию сортировки много сотен или тысяч раз между измерениями.
Т.е.
Yanis © (26.10.04 23:48) [1]
var
pStart,pEnd:Integer;
begin
pStart := GetTickCount();
for i:=1 to N do
// код
pEnd := GetTickCount();
tm := (pEnd - pStart)/N;
Число N подобрать исходя из общего времени tm в несколько секунд.
Denis (2004-10-27 11:39:00) [3]интересно, насколько актуален этот код для Delphi?
позже проверю.
Взято из лекций по решению олимпиадных задач. Автора не знаю.
const timetest=10;{время тестирования программы}
var timer:longint absolute $40:$6c;
timeold:longint;
begin
timeold:=timer;
while true do
if timer-timeold>18.2*(timetest-0.5) then
begin
…{запись текущего результата в файл
или сообщение об отсутствии решения}
halt
end
else {собственно работа программы}
Данная программа использует тот факт, что к значению четырехбайтовой целой переменной, расположенной по абсолютному адресу $40:$6С, раз в 1/18.2 секунды аппаратно прибавляется единица.
Anatoly Podgoretsky (2004-10-27 11:32:00) [4]TUser © (27.10.04 10:37) [11]
Коротких нет смысла, длинные стоит, но это и на глаз щаметно, точное значения нужны только если проверять разные алгоритмы оптимизации, чтобы было с чем сравнивать.
TUser (2004-10-27 10:37:00) [5]
> А зачем считать миллисекунд - это же мгновенно, другое дело
> секунды, но их и без подсчета видно.
Т.е. время работы алгоритмов вообще не надо измерять?
Anatoly Podgoretsky (2004-10-27 08:46:00) [6]А зачем считать миллисекунд - это же мгновенно, другое дело секунды, но их и без подсчета видно.
Юрий Зотов (2004-10-27 08:13:00) [7]Не годится такой метод для мультизадачных систем. Разве что для грубых измерений, но никак не для миллисекундных.
Что получится, если между двумя вызовами GetTickCount система передаст управление другому потоку? Ошибка получится, и, возможно, немалая (а если этот другой поток еще и имеет повышенный приоритет, то ошибка вообще может быть сколь угодно большой). И самое плохое то, что оценить величину этой ошибки невозможно (да и нестабильна она, к тому же).
Выход - использовать GetThreadTimes.
_def[eND]er (2004-10-27 03:38:00) [8]Точно :)
Бывает :))
PKT (2004-10-27 02:00:00) [9]to: def[eND]er (27.10.04 01:40) [5]
Тоже неверно :о)
ShowMessage('Прошло ' + IntToStr(GetTickCount - I) + ' секунд');
_def[eND]er (2004-10-27 01:42:00) [10]Хотя и там было правильно, видимо спать пора :)
_def[eND]er (2004-10-27 01:40:00) [11]А вот и неверно :)
Вот как надо:
procedure Something;
var
I: Cardinal;
begin
I := GetTickCount;
... // Код, скорость которого надо узнать
ShowMessage('Прошло ' + IntToStr(GetTickCount - I) + ' секунд');
end;
Palladin (2004-10-27 00:40:00) [12]И что же не верного видно твоему наглазу?
mishapost (2004-10-27 00:30:00) [13]По-этому алгоритму на глаз видно что считает он не верно
Yanis (2004-10-26 23:49:00) [14]забыл :)
А затем
ShowMessage(IntToStr(pEnd-pStart));
Yanis (2004-10-26 23:48:00) [15]Сейчас скажу.
var
pStart,pEnd:Integer;
begin
pStart := GetTickCount();
// код
pEnd := GetTickCount();