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