Исполнение кода в цикле

<!--StartFragment -->
Обычно при первом исполнении некоторой части кода времени тратиться больше,
чем при ее повторном исполнении. И причины этого следующие:

9.1 При загрузке кода из RAM в кеш требуется больше времени, чем на
    исполнение этого кода.

9.2 Декодирование кода - тонкий момент. Если требуется 1 такт на декодирование
    инструкции, то не возможно за этот-же так декодировать вторую инструкцию,
    т.к. процессор еще не знает длину первой инструкции. Pentium решает эту
    проблему запоминая длину любой, только что выполнившейся инструкции.
    Следствием этого является то, что при первом исполнении инструкции не
    спариваются, за исключением случая, когда длины обеих команд  - один байт.

9.3 При первом проходе ветви еще не в целевом буффере, и, следовательно,
    вероятность правильного предсказания перехода меньше.

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

Четырех этих причин более чем достаточно, что бы код цикла при повторном
исполнении требовал меньше времени, чем при первом.

Если ваш цикл слишком большой и не помещается в кеш, то против вас сработают
9.1 и 9.2. Вы должны попытаться реорганизовать цикл, что бы он целиком
помещался в кеш. Если у вас более 256 переходов и ветви в цикле, то против
вас сработает 9.3 по полной программе.

Равно как, если ваш цикл часто обращается к слишком большим структурам данных,
то замедление скорости будет связано с многочисленными промахами кеша данных.



Опубликовал admin
26 Мар, Пятница 2004г.



Программирование для чайников.