Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.146.105.194] |
|
Сообщ.
#1
,
|
|
|
Советы программисту Оптимизация кода программ / "Code Tuning" Но помните, "Premature optimization is the root of all evil" © Donald Knuth |
Сообщ.
#2
,
|
|
|
есть пара вопросов
почему глобальные переменные тормозят программу? Обращение к глобальной переменной идет как mov al,ds:[000a8] т.е. по константе, а к локальной как mov ax,ss:[0fff0][bp], т.е. еще приплетается регистр. Вот переменные в динамической памяти действительно достаются сложнее, чем глобальные или локальные, точный код не приведу, но схема примерно вот такая: les di,dword ptr ds:[000a8]; mov al,es:[di] т.е. два обращения к памяти, причем скорее всего второе место в памяти в кэш процессора не попадет. далее, сравнение x in ['A'..'Z'] выполняется как byte[the_set+(x shr 3)] and (1 shl (x and 7))>0 где the_set занимает 32 байта в сегменте констант (скорее всего в коде ) и дважды выполняется операция "достать Х из памяти" (в явном виде 2, на самом деле Паскаль регистры почти не использует, так что может быть и 1), в этом случае проще достать один раз Х и сравнивать его с константами (hard-coded) mov al, byte ptr x; cmp al,'A'; jge dalshe; cmp al,'Z'; jle dalshe; jmp nevyshlo а вот с более разорванными множествами целесообразнее применять if X in [...] Типа byte не всегда хватает, особенно если потом идет модификация кода с целью увеличить объем обрабатываемых данных, кроме того есть некоторая оптимизация при использовании двухбайтных типов и включенным word align data (возможно, что она устарела). Longint куда попало пихать не следует, это правильно. Цитата Romtek, 21.09.04, 23:27 Используйте move вместо строковых присвоений странно, я все время думал, что при строковых присвоениях используется именно move() |
Сообщ.
#3
,
|
|
|
Взял большинство советов со странички по адресу http://www.stevemcconnell.com/cctune.htm
А вообще моих советов тут немного... |
Сообщ.
#4
,
|
|
|
Для очистки множеств лучше использовать это:
FillChar(x,SizeOf(x),0); где х - заданное множество. По сравнению с x:=[] прирост скорости ~1.5 раз.... |