Главная » Просмотр файлов » Искусство программирования на Си

Искусство программирования на Си (984073), страница 12

Файл №984073 Искусство программирования на Си (Искусство программирования на Си) 12 страницаИскусство программирования на Си (984073) страница 122015-07-19СтудИзба
Просмтор этого файла доступен только зарегистрированным пользователям. Но у нас супер быстрая регистрация: достаточно только электронной почты!

Текст из файла (страница 12)

можно, более эффективными алгоритмалэи. торыс нс связаны с работой собственно слгоритлэа. подсчитано количество вызовов функций язв[в, Часто наиболее необоснованныс решения по выбоЬпйцевог[ и сош вге Каж й аз ел ф * Рафнческий профиль лает нам пишу для Размыш- ру алгоритма сконцентрированы вокруг проблем сорти- РассмотРим пример Прсдполоэкилг, вам тРебУетсЯ лений о.том, какие функции следовало бы оптимизи- Зт т пр дмст изтчсэ э дствэял (и лаже занимает отсортировать список слов безотносительно к регистру именем функции с отступом в колонке "имя" (колонка 6). В Ровать.

В отличие от плоского профиля, на графичес- г аву э этой книге) К счастью язык С обсспс- букв. ]]ля начала вы вызываете функцию йяог[ и в ка). Внутри каждого раздела вызванные подпрограммы ()нжимннтчин Пересмотренным нтик С Глава 3 'хпс хоо (в, Ы ( а=а-Ь; Ь++; а = а т Ь; геешп а; ) реализация стратегий оптимизации, или микрооптимиэация ((дегхпв Доо (а, Ь) ( ( (а) — (Ь) ) * ( (Ы + 1) ) л н"-*-'.',!'"',"=и ' Ь":.,;н:гр а ...у кж-яд'Л1,'.* .*":-":хе" "' "" ' '""* и "зхт м '~н -' 'т ь рвнь.."к-".л о:лен„.'зн!;-'-".,нзв ."', ! )е,,';...,*, ( (1 *-"'--:;: "т н„н,1 б '" "" х ""' """ "' % ' ',' "С',."','„,е ! „ех -'"~.

'1.н.я 111',5', е >ЛП",:' ."-'"; яжл.,' " чтет,'.аз~бее,:,;,,-.-;Ьь „,", н,.:е-, +,,ъ' "'.!. ' 1'"1- ° "-;;ей%С . ';;.1 1 '..' "",,.'-'.."'."": МЗ..".'Гт ' Ьее -. Кн".Рнч -," ", ''.11( "" ' ' ° ' ' ' )цх;:,е3' "" ':.Н-Я.1'.,":. ' 1", д ь'т „'1:;,; ';;.'; ",'1)су ' Е "', ","',„,' '»1 Н -'1...'"'1 .",'" т ', ' не (-и,;-,'".и,;-.1...;; ":,.:, чтт. "*'* "'-,' -',".*(-11(1..'" ' . ануем!С-:,-"в,мян;...г)уга ггрн--:"'нт.' ,-:"-,:-".' В"--'ф'"-"'н::.'гг.й'„Ь.'!'**-':-'-=""П 1т(-*':::;"и*„,",,.' *,:,- и ' "" ' " х »11 ) 1 "; ' '',1 ы -и е.** я(г -'С **,'* е'х;*,'л'ег'*'; .

т+".'(*',л ...':,',.'*, Н,'," 1 ' '", 1 '"' Д'.~ ег1„гв Гй ', '.Ре ":...;и*;;,нс ":" ": Ь,1 и -'зн', .ев; „'...,"'' ",1(: с н в;1т'.' т,те Нн.и..'".'1 'ьт.„-,',;,- ... и =.:";;;,*,* !'**.,;,";„.-",,': а':,.;. 11 л :жен ин чтд 1е в вать переписать ее так, чтобы задействовать в ней как можно меньшее количество более простых и/или хорошо известных алгоритмов. Важно избегать использования алгоритмов с невыгодными О-нотациями, наподобие 0()чп), и попытаться заменить их алгоритлеалти с лучшими О-нотациями, такими как 0((ч) или, по крайней мере, 0((т( (ок (Ч).

В этом разделе мы обсудим некоторые пути, позволяющие немного поправить ваш код так, чтобы ускорить его выполнение. Оправданием этому является тот факт, что при анализе О-нотаций алгоритмов от времени, занимаемого всем алгоритмом, отбрасываются константы и вклады более высокого порядка малости. Перенося свои усилия по оптимизации алгоритма на этот уровень, мы можем добиться определенных улучшений, которые, хотя и менее эффектны, чем улаление необяза- росом текст или выполнять по пел!у отладочные опера ции, поскольку такой текст может получиться доволь но сложным.

Рассмотрим следующий пример кода до оптимиза пи и. А ниже представлен пример эквивалентного кода который был преобразован путем ннлайнинга макросом Дополнительные круглые скобки в макросе необходимы для сохранения группировки на случай, если функция йю используется в выражении, которое имеет более высокий приоритет, чем *, или в случае, когда а П ограммы профилирования не различают макросов, так Р что в дапьнеишем их сложно будет оптимизировать, если однажды вы использовали их дпя инпайнинга. Рааварачиваниа цикла В том случае, когда время на итерирование самого цикла становится сравнимым с временем, затрачиваемым на выполнение инструкций внутри цикла, можно использовать прием разворачивания кис<а ((оор цпгорйпб) для экономии времени.

Для этого повторите тело цикла несколько раз (для начала 510 раз) и вставьте минимальный код, необходимый лля корректировки счетчика цикла или других состояний циклического процесса. Многие компиляторы сами автоматически могут выполнять такое разворачивание цикла, но, если вы знаете, делает ли это именно ваш компилятор, попробуйте осуществить разворачивание самостоятельно.

Рассмотрим следуюший пример с однооператорным циклом Гог: ворачивать цикл на том основании, что разворачивание будет изменять результат. Если приложение нечувствительно к излишней точности, вы можете осуществить выполнение проверки снижения сходимости путем дублирования тела цикла. Это особенно полезно, если проверка на сходимость является более трудоемкой по отношению к трудоемкости вычисления результата. Развернутый цикл получается больше по размерам, чем его 'свернутая" версия, и потому может не помещаться в нзш инструкций (на компьютерах, имеющих таковые). Это может привести к тому, что развернутая версия цикла будет более медпитепьной.

Кроме того, в нашем примере обращение к функции соде может требовать значительно бопыпе времени, чем модификация счетчика, так что в данном случае любая зкономия от разворачивания цикла может оказаться незначительной по сравнению с тем, чего бы вы достигли путем инпайнинга функции соде. Если вам случится испопьзовать векторизированныи компилятор вд .сжпеокомпьютере разворачивание цикла "' **'* 'т ' "'*'', *-"*-*-,'',*'":,'";:,*,*".."-,-:;-','...ъ'.::,. (Су"'-.С';,г.;";„те.* > ц(, ен у унт,'-",, '..

В„;", К-.;.чтц у' ай ! з-'-"'-тнл!";; ~'::,,' ь)с"...-";;;.„.-'-';хне.;„;:-',::". ауч;,,:., -.;; -.,::- „,; Г ннтн',. (н, т '. "',нчй "К'сед 1(1,' ...:: ., "; т 1),„"1„' !"1 т' .' ',",ня '; О р Переемитренный инее С Онтииитлии Часть ) Глава 3 стоятельствах таким образом можно улучшить локаль- После оптимиза ии п ем е к имизации путем редукции строгости вы- (Ех(епг — экстент, или непрерывная область (например, Вернемся к упоминавшимся выше условиям. Чтобы ность ссылки (определение см. ниже), что улучшает ений он б ет выгл еть еле в памяти с прямым доступом), резервируемая для оп- получить преимушества от проведения оптимизирующеповедение каша.

(Этот пример предоставлен Ахо (АЬо) н и Ь 7 Г /* немного эмомоммее, чем релеленного набора данных. — Прим. науч. ред.) А)и)Я го ТКЕ, функция должна возвращать значение рекури Ульманом (\))Ьпап)) нтчмелемме осмента он денвммн е/ предусматривает, что арифметические выражения рас- сивного вызова без каких-либо дальнейших вычислений. х и х' /е Обращение цикла у — х; / умнокевве ековомаее, чем сматриваются в той последовательности, как они струп- Рассмотрим этот демонстрационный код: возведевае н степень е/ пированы в коде, чтобы избегать любых нежелательных Некоторые компьютеры имеют специальную инструк- и = (у ее з! + у; /* сдвиг в слоневве 1нс 1венлеауеаг (еЬаг е евг) екоаомаее, чем умноненне '/ сюрприюв Это означает, что выражения ( цию для уменьшения значения счетчика и сравнения его ( Г1ОНС а Ь С Е Г - ГГ (еает = '10') Гвгеха 1; величины с нулем.

Можно использовать одну из этих рг1аг( ( ее), ь); Г1 С а, Ь, с, Е, Г, Ве е1ее з( ( ! гаерасе (*нег) ) гегнга 0! специальных инструкций и переделать ваш цикл так, Ь +и 14! /' слоненве экономнее, чем е1ае ге1нга 1еенреуегг (++в1г); аиЬ/с'дг побы внес прибавле ил ксч илу по санного дна- Умноневне */ = / ГиЬед/ее ) чения выполнялось вычитание и цикл останавливался Здесь можно применить ТКЕ для заключительного не будут рассматриваться как имеющие общее подвыр р четчика нулю вместо равенства его не- Заметьте также, что индексирование массива в С в оператора ге(вгп, поскольку возвращаемое значение из которому максим м . ражение Ь/с.

Если же вы перепишете второе выражение у у. основном осуществляется путем умножения и сложения. этого обращения к )зешр(умг будет в точности равно не )— Предполагая, что цикл не вствителен к нап аалто цикл нечувствителен к направле- Поэтому в некоторых случаях выражения умножения так: без необходимости дальнейших вычислений.

нию изменения значения счетчика, можно и начен я счетчика, можно попытаться можно подвергнуть оптимизации путем снижения их 11оае е Ь с е) Г д Ниже представлен пример, когда ТКЕ не может быть просто изменить его нап авление. направление. строгости, особенно когда циклы осуществляются по црнменено Здесь представлен типичный в языке С цикл Гог: массиву. аЬ/с'ГП г=ь/с*ее 1нс Геееог1а1 (1нв нем) ГОГ (1 = 1е 1 <= мале 1е+) ( ИнваРиантиыЕ ВЫчислениЯ Цикла то компилЯтоР АХЯ С тепеРь может вычислить Ь/с „,„„я, Переемлзлреннмйязнн С 1 Часть 1 Олнзнмнззчня Щ гистр в процессе вызовов функции. Однако он может опустить в регистр переменную а.

Чтобы отслеживать проблемы, подобные этим, можно использовать ключевое слово гейитег; если 0 будет объяачена как герв1ег, компилятор будет предупрезхден о том, что получен ее алрес. Использование плавающей точки ° Вместо кода атгсру (а, " ") попробуйте использовать запись "э = лзе'. Эзо также позволит избежать совершенно необязательного вызова функции копирования. ° Знайте, что функция аггпсру дополняет короткие строки нулями.

За исключением первого нуля, которым заканчивается строка, дополнительные нули Гззбйзчлипл лииКотеданнелИ01зойьЗКЮтелл тйКДуолПОВ ";",~:,. выполнения достаточно жестких условий, которые вы- Строковые операцин ставляет ТКЕ. Если вы с самого начала оптимизируете Большинство библиотечных символьных и байтовых исходный код, перел перезаписью кода в целях приме- строковых функций языка С выполняются по времени пения ТВЕ рассмотрите использование простой итера- пропорционально длине строк, переданных этим фунции.

кциям в качестве параметров. Достаточно просто оргаНаконец, если рекурсивная функция содержит цикнизовать некий цикл по нх вызовам и таким образом лы или большой объем кода, ТВЕ будет лишь незначизаставить ваш процессор долго и напряженно выполнять тельно полезным, поскольку ТВЕ оптимизирует толь- множество лишней работы. Ниже перечислены некотоко рекурсию, а не сам алгоритм. Вызовы функции сами рые советы, которые могут облегчить такую ситуацию: по себе осушествляются очень быстро, и эффект оптимизации этих вызовов потеряется в массе вычислений ° Избегайте вызовов функции вгг1еп длины строки в внутри самой функции. процессе цикла, включаюшего эту строку. Даже если вы модифицируете строку, можно было бы изменять Табличный поиск ее длину так: перед циклом вы устанавливаете знарассмотрим использование поисковых таблиц, особен- чение ллины стРоки х = втг)епО, а затем, когда внУт- но если приходится выполнять итеративные или рекурри цикла добавляете или удаляете символ, пишете п сто х++ или х — соответственно.

сивные вычисления, например, схоляшиеся рялы нлн просто х или х соответственно. факториалы. Вычисления, занимающие константное ° Когда вы строите длинную строку в памяти с исвремя, часто могут выполняться быстрее, чем их резуль- пользованием функции конкатенации зтгсаг, она ,"'зз,.' э'. йт .",,'-" 1'не"*з..е,' ° Проверки на незаполненность строки обычно реализуются в виде зтт)ев == О, и даже опытные программисты лля этой цели используют именно функцию з1г1ев. Но ведь если строки, с которыми вы работаете, имеют существенную длину, функция згг)еп будет покорно проверять каждый символ, пока не обнаружит завершаюший Х1)Ы,. Заменив указанную форму проверки на *з == ''уб', вы проверите только первый символ и таким образом сэкономите время на вызове функции этг1еп.

Характеристики

Тип файла
DJVU-файл
Размер
12,26 Mb
Тип материала
Высшее учебное заведение

Список файлов книги

Свежие статьи
Популярно сейчас
Как Вы думаете, сколько людей до Вас делали точно такое же задание? 99% студентов выполняют точно такие же задания, как и их предшественники год назад. Найдите нужный учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
6353
Авторов
на СтудИзбе
311
Средний доход
с одного платного файла
Обучение Подробнее