"Оптимизация для PENTIUM процессора" - читать интересную книгу автора

1 (byte) 1
2 (word) 2 (или адрес MOD 4 >< 3. другие процед. треб. выр. на 2)
4 (dword 4
6 (fword) 4 (Pentium Pro требует выравнивания на 8)
8 (qword) 8
10 (tbyte) 8 (Pentium Pro требует выравнивания на 16)

На не выравненные данные потребуется, по крайней мере, на 3 такта больше для
доступа.

В выравнивании кода нет необходимости, когда вы работаете на Pentium, но для
оптимальной производительности на других процессорах вы можете выравнять
точки входа в подпрограммы и циклы на 8 или 16.


6. КЕШ
======
Чип Pentium имеет 8k кеша (L1) для кода и 8k для данных. Данные на L1 могут
быть прочитаны или записаны за 1 такт, а в случае промаха кеша это может
стоить многих тактов. По этому очень важно, что бы вы поняли как
работает кеш и могли использовать его с максимальной эффективностью. К
сожалению в большинстве других документов кеш описывается либо недостаточно,
либо слишком непонятно. Я надеюсь, что вы сочтете это описание одним их
лучших.
Кеш данных состоит из 256 строк, по 32 байта в каждой. Всякий раз, когда вы
пытаетесь прочесть данные, которых нет в кеше - процессор прочтет из памяти
целую строку. Строки кеша всегда выравнены по физическому адресу, делимому на
32. Значит всякий раз, когда вы прочитали байт по адресу делимому на 32,
следующие 31 байт могут быть прочитаны практически мгновенно. Вы можете
воспользоваться этим преимуществом, размещая часто используемые данные в
блоках, выравненных по 32 байта. К примеру, если у вас есть цикл, который
работает с двумя массивами, тогда вы можете скомбинировать эти два массива в
одну структуру, что бы данные, которые обрабатываются совместно и загружались
совместно.
Если размер массива кратен 32 байтам, то было бы неплохо выровнять его на 32
байта.
Строка кеша не может быть связана с произвольным адресом памяти. У каждой
строки кеша есть 7-битное установочное значение, соответствующее битам с 5-го
по 11-ый физичекого адреса памяти (биты 0..4 соответствуют 32 байтам внутри
строки кеша). Таким образом у нас есть два блока по 128 строк (всего 256
строк), в каждом из которых могут существовать две строки, ссылающиеся на
один и тот-же адрес памяти. Следствием этого является то, что мы не можем
иметь в кеше более двух строк, указывающих на физические адреса памяти,
имеющие одинаковые биты 5-11. Мы можем определить, имеют-ли два адреса
одинаковое установочное значение следующим образом: Сбросить младшие 5 бит,
каждого адреса, что бы получить значение делимое на 32. Если два адреса,
со сброшенными младшими 5 битам кратны 4096 (=1000h), то эти адреса имеют
одинаковое установочное значение.

Позвольте мне проиллюстрировать это следующим кодом, где адрес в ESI делим