К. Касперски - Техника оптимизации программ, Эффективное использование памяти (1127752), страница 42
Текст из файла (страница 42)
2.45. Демонстрация эффективности различных алгоритмов переноса памяти (увеличено) 35000000 $ и 30000000 у 25000000 о 20000000 в (С с о15000000 ф (ООООООО Ж е 5000000 Сравнение функций гпепнпоче и МуМегпМоче аачввлаао О(а«гавлова аамввлассо СЧ СЧ (Ч СЧ (Ч (Ч (Ч (Ч (Ч СЧ С'Ъ С'Ъ Оперативная память Рис. 2.46. Сравнение функций иешиоче и мунеиноче на системе АМ0 А1))!оп 1050/100/100/ч)А КТ133 Фбетгае Вот 51ЕЕ25б*К ааГ Муиеаиоче)сваг *бес, сваг *его, 2аГ агге) 1 сваг ВСУ 1)ВСУ 51ЗВ)2 сьаг Вот г[ВЦт 5125]; сваг *р1, *р2) гоГ а,х = 12 1аГ бе1са2 бе1Га бас-згс; 1Г 1)бе11а>Вот 512Е) )) (бе1га<1)) гесига -1> р1 - ВСУ 1; р2 его! уог)а = вп а<а1ге/бе1га2 а++) ( иегсру)р1, бас, бе1Га) ) гвв Глава г пепсру (бас, р2, бе1Га); (х) р1 = ВОВ 2) р2 = всг 1) х О; е1ае р1 = ВОГ Ы р2 = ВОГ Ы х = 1) баГ += бе1Га; гегпгп О) Оптимизация функции татстр Несмотря на то, что функция пеппер не относится к числу самых популярных (так, в МБРХ (М!сговой Реу!!орет Нег)вот!( — комплект документации от М!сговой, поставляемый с ее компиляторами и доступный на сайте компании) функция ру упоминается 500 раз, а р и о е — всего 150 и 50 раз соответственно), это еще не дает оснований пренебрегать качеством ее реализации.
Начнем с анализа штатных библиотек вашего компилятора. В большинстве случаев сравнение блоков памяти осуществляется приблизительно так (листинг 2.33). гога * сбес1 пеессру (еогб * беас, сопаГ ъо1б * агс, гпс с, ппагдпеб соппс) хь11е ( соппг еа (*((сьаг *) (бега (сваг *) беаг + 1) - 1) * ((сваг ") (агс = (сваг *) агс е 1) — 1) ) ! (сваг) с ) соппс †; геспгп(соипГ 2 беас : ВОЬЬ)) Фи! Медленное побайтное сравнение безо всяких попыток оптимизации! Правда в комплект поставки У1вца! С++ входит и ассемблерная реализация той же самой функции (нщите ее в каталоге ~ЯКА,1пге1). Ну-ка, посмотрим, Оперативная память гоо что там (по соображениям экономии места исходный текст не приводится); ага, если оба указателя кратны четырем, сравнение ведется двойными словами (что намного быстрее) и лишь в противном случае — по байтам.
Гуд!? А вот и нс гуд! Кратность начальных адресов — это условие вовсе не обязательное для 32-разрядного сравнения (строго говоря, процессоры серии 80х86 вообще не требуют осуществлять выравнивания, просто небрежное отношение с нсвыровненными адресами может несколько снизить быстродействие— подробнее см. разд. зйыравнивание данных" этой главы). Если три младших бита обоих указателей одинаковы, функция может выровнять их и самостоятельно, просто сместившись на один, два или три байта "вперед". Впрочем, эти рассуждения все равно беспредметны, поскольку в режиме оптимизации по скорости (ключ юг) М!сгозой Ч[зца[ С++ отказывается от использования ряда библиотечных функций и заменяет их шгппяс (см.
"ргайша шгг[пгйс[у[[













