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

уже через 50-100 ns. Если запрашиваемые данные не в L2, то задержка составит
порядка 200-300 ns. Эта задержка может быть и большей, если вы пересечете
границу страницы DRAM. (Размер страницы DRAM 1Кб, для 4Мб 72 пиновых модулей
и 2Кб для 16Мб модулей).

Когда вы записываете данные, по адресу, не находящемуся в L1, данные будут
помещены в L2. Это займет примерно 100 ns. Значит если вы пишете 8 или более
байт в 32 байтовый блок, не читая ничего от туда, то лучше всего будет просто
прочитать от туда что-нибудь, что бы загрузить блок в L1. Все последующие
записи в тот-же блок будут записываться во внутренний кеш, и каждая запись
займет 1 такт. (Это не нужно на Pentium Pro, где всегда загружается строка
при промахе записи). Иногда возникает замедление при повторяющихся записях,
без промежуточного чтения.

Иногда можно уменьшить количество промахов при записи, записывая по 8 байт,
используя FILD / FISTP с DWORD операндом, вместо использования целочисленных
регистров. Более медленное исполнение инструкций FILD и FISTP компенсируется
тем, что вы должны сделать только половину необходимых циклов чтения-записи.
Тем не менее этот метод эффективен только на Pentium и только если адрес
записи не находиться в кеше. Более подробно этот метод будет рассмотрен в
разделе 19.

Временные данные вы можете помещать в стек, поскольку стек скорее всего
попадет в кеш. Знаете вы или нет, но тем не менее, если вы сохраняете QWORD
данные в DOWRD стеке, или DWORD данные в WORD стеке, то у вас может быть
проблема с выравниванием.

Если рабочее время двух структур не пересекается, то они могут использовать
одну и ту же область памяти, для повышения эффективности кеша. Это
соответствует общим правилам распределения памяти временным переменным в
стеке.

Конечно, хранение данных в регистрах более эффективно, но поскольку регистров
не много, то возможно вы захотите использовать [ESP], а не [EBP] для
адресации данных в стеке, тем самым освобождая EBP для других целей. Просто не
забывайте, что значение ESP изменяется каждый раз, когда вы используете PUSH
или POP. (Вы не сможете использовать ESP под 16 битной Windows поскольку
таймер непредсказуемо изменяет старшее слово в ESP).

Pentium имеет 8Кб кеша кода, имеющих структуру, похожую на кеш данных. Значит
важно, что бы критическая часть вашего кода (внутренние циклы) полностью
помещалась в кеш. Часто используемые части кода или структуры, которые
используются вместе, было бы предпочтительно и хранить вместе. Редко
используемые ветви или подпрограммы должны храниться дальше.


7. БЛОКИРОВКА ГЕНЕРАЦИИ АДРЕСА (AGI).
========================================
Требуется один такт, что бы рассчитать адрес, требующийся инструкции для
доступа к памяти. Обычно это делается отдельно, в конвеере, пока выполнятеся