![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Рекурсия или цикл!? [Delphi, Windows]
Аболтус © (2003-02-02 23:55:00)вот эт снова я с глупыми вопросами :)))
Скажите мне пожалуста какой способ быстрее попиксельно выводит на канвас картинку в цикле или рекурсивно?
И еще почему то не получаеться посчитать скока времени уходит на выполнение процедуры т.е.
GetTickCount
Procedure
GetTickCount
потом вычитаю значения и получаю 0
Sha (2003-02-03 15:40:00) [1]Причем, даже если в параллель и не работает другой процесс, все равно надо сделать несколько замеров и выбрать минимальный - он ближе всех цели. Спасибо Билли.
Mirovodin (2003-02-03 15:27:00) [2]Только нужно учесть, что это кол-во тактов процессора в общем, а не в твоем конкретном приложении (куске кода). Грубо говоря результаты будут разные в случаях :
а) работает только твой процесс.
б) в фоне работает ресурсоемкий процесс + твой.
Sha (2003-02-03 15:26:00) [3]Sha © (03.02.03 15:04)
2 Darthman (03.02.03 14:55)
В догонку.
Время в тиках проца будет сидеть в t.
Если проц 1ГГц, то дели t на 1000 - время в usec
Если проц 1ГГц, то дели t на 1000000 - время в msec
Если проц 1ГГц, то дели t на 1000000000 - время в sec
Sha (2003-02-03 15:04:00) [4]2 Darthman (03.02.03 14:55)
Если проц 1ГГц, то дели t на 1000000000 :)
Darthman (2003-02-03 14:55:00) [5]Не, ну это я понял. Тоесть а как ты предлагаешь вычислять кол-во тиков затрачиваемых на выполнение операции процом?
Sha (2003-02-03 14:46:00) [6]Поправка:
var
t: int64;
t:=GetCPUTick;
..твой блок..
t:=GetCPUTick-t-13;
Sha (2003-02-03 14:45:00) [7]> Darthman (03.02.03 11:45)
> Как с помощью этой функции время-то получить?
var
t: int64;
t:=GetCPUTick;
..твой блок..
t:=GetCPUTick-13;
После этих операций в t сидит количество тиков процессора, потраченных на выполнение твоего блока. 13 - это количество тиков, потраченных на выполнение самой функции (на моем проце).
Информация к размышлению: за 1 сек процессор делает столько тиков, какова его истинная частота, например, 1ГГц = 1000000000 тиков. Дальше думай сам.
Anatoly Podgoretsky (2003-02-03 12:36:00) [8]Аболтус © (03.02.03 01:04)
Не использовать глубокую рекурсию
Darthman (2003-02-03 11:45:00) [9]>>function GetCPUTick: int64; assembler;
>>asm
>> db 0fh,31h; //rdtsc
>>end;
Как с помощью этой функции время-то получить? Эта функция только количество тиков проца даст с момента последнего сброса.
Mirovodin (2003-02-03 11:26:00) [10]Рекурсия дольше по тому, что перед вызовом процедуры, Delphi сохраняет регистры (Push, Pop) т.е. на каждый вызов делаются дополнительные команды процессора.
Ketmar (2003-02-03 10:44:00) [11]2Аболтус:
упрощать алгоритм и учить матчасть.
Satanas Nobiscum! 03-Feb-XXXVIII A.S.
Аболтус (2003-02-03 01:14:00) [12]И почему Блок:
try
except
не обрабатывает EStackOverflow ?
Аболтус (2003-02-03 01:04:00) [13]К вопросу о переполнении стека как от него избавиться?
Asteroid (2003-02-03 00:44:00) [14]Проще циклом. Быстрее - рисовать попиксельно на канву в памяти, а ее рисовать на настоящую.
В зависимости от алгоритма рекурсии и размеров канвы, может появиться Stack overflow.
Аболтус (2003-02-03 00:28:00) [15]Ну по поводу рекурсии надо учесть следующий момент: рекурсии надо обработать меньшее количество пикселов
Sha (2003-02-03 00:07:00) [16]Цикл обычно быстрее рекурсии.
GetTickCount дает текущий тик таймера. Поэтому для быстрых процедур всегда будешь получать 0 (один и тот же тик) или 1 (соседние тики).
Используй GetCPUTick, который дает тики процессора:
function GetCPUTick: int64; assembler;
asm
db 0fh,31h; //rdtsc
end;