Искусство программирования на Си (984073), страница 11
Текст из файла (страница 11)
Даже функции, которые не выполняют ввод/вывод или многозадачность, могут оказывать влияние на иерархию памяти. В большинстве компьютеров имеет место строгая иерархия скорости доступа к памяти, и чем дальше мы идем по ступеням этой иерархии, тем более увеличивается время доступа к данным: ° Регистры СРП вЂ” почти мпювенный доступ. Ъ'элсдд.—, .кляч.
Л~зккяз й я..пз ° ч..,кзкляз. М яа, к я '-';.,Олз .я'" ': "'.'„....',';,"„', ' " т,.„",":,,'Ь':" ";У,,"-"'„-З-'",' з "..,.,,кзч ':,,'...-';.";.: л!;,":"."',*-';"" ",,' з," .,'"',;-"', '";"' о;;...-"-:!, "**.'.ч ,О, .';;х ?7 Б'=.' *' !:А '.Х л-~'-'~':, ': ":.-»'~, ,», 'к ,''к" з ","" ",21 ":;„' 'зз,"з."," "; "':Ф; '": '." Т,, .'..'У„'.,'.'",',,', ': "" -У ,.*,*;-.'";-,г;я;Е ,'-. Ь'*'-к;у ~Ь,' я"...Е.'."'„„;,:, "-;,".," .. 1";, '...:. ",";, „"; '.'-".' яел. я ...„;"-';*',,'- -";г;Е.„.:, з.„я' „'"е',,'',з;::;~'. '. '.".,„"-, ли',,':,: -,,',",",'та';„.', ':. =„,-;:,'...':,";.,'„';.э,=,.;лбл-':,-":.,-"..';,,'л',:;,;,: () ...," '':...,.'; ', „'к"" ',;"з"„,'-:; '4, ~',Е " „",, '"„' ' ',ги,ь'„ з Ё'.з -":,'-!*;.„.:, з;:,'.'-,'*,*,.
л' '', " к ,'гз",, ", ',~2 И" -' " х (41 я .Ч Ёуззс ", Я;";,.4 Какая функция быстрее — ша11ос или бее? Какая функция выполняется дольше — завей или гаил)? Функция ехй выполняется дольше, чем зуа(еш? Или наоборот? В табл. 3.1 приведены относительные скорости выполнения отобранных операторов и библиотечных функций на несколько староватом (но до сих пор функционируюшем) компьютере Ьцп ЬРАВСиайоп 2.
Таблица была построена путел~ выполнения операций несколько миллионов раз, вычисления потребовавшегося для этого времени и затем его деления на число итераций. Программа, с помощью которой составлена эта таблица, помешена на лцеЬ-сайт издательства "ДиаСофт" под названием аваев.с. В первой колонке таблицы указана операция или функция, которая была хронометрирована.
Во второй колонке приведено время выполнения операции в мик- и:-,':,,:".'е,'..';, зля ж":." П"-"„; -"„'=-':,",:"::;„,, =',, ъ ' жать. Это бывает, когда ваша программа перемалывая числа массива что называется "захлебывается". Не все компьютеры имеют кэш (более старые процессоры СР(3 были настолько медлительны, что скорости ВАМ хватало с избытком).
Кроме того, кэш чувствителен к шаблонам, в которых вы обрашаетесь к памяти. Если вы обрашаетесь к данным в шаблоне, который повторяется через равные интервалы, подобные размеру строк кэша, то при успешном доступе к памяти все данные могут отображаться в одной и той же строке кэша. При этом кэш недостаточно полно используется. Вторая проблема состоит в том, что кэш не обязательно делает что-либо для повышения скорости линейного доступа к памяти. Если вы просканируете 24 Мб памяти, кэш в конечном счете все их будет читать и пропускать через одни и те:ке ограничители системной шины.
Конечно, ВАМ вЂ” это то, что обычно имеют в виду, когда говорят о памяти. Интересно, что в последнее шеи программы может замедлиться в тысячу раз и бо лее. О-нотация предо~валяет собой широко используемый метод определения скорости работы алгоритма или функции. О-нотация для алгоритма предстаачяет собой формулу, которая позволяет вычислить верхний предел ресурса, используемого алгоритмом, после вынесения за скобки констант и времени, затраченного на все иные операции, отличные от операций внутреннего цикла ачгоритма. Наиболее часто такая формула описывает время, требуемое для выполнения азгоритма, но может также использоваться для описания необходимого пространства памяти или некоторого другого ресурса. О- нотация иначе может называться "сложностью" или "большим-О" алгоритма.
В качестве упражнения ниже приведен пример программы, которая будет исчерпываюше исследовать и Перегиотргннииязин С Гзнзнииизииия фЯЯ$ Часть ! Глава 3 !яйдИ6 ° О(1). Часто упоминаемый как константное время но неуклюжим в случае больших входных наборов. элемент от другого. Например, если вы сортируете сту- лельно, равна большей из О-нотаций каждого из (сопагап! Визе), этот алгоритм выполняется до завер- Для того же набора в 100 входных элементов время дентов по последнему имени для определения класса, алгоритмов: щения одно и то же время независимо от размера работытакогоалгоритмасоставияобы примерно!()зз возможно, только первые три или четыре символа не- О(Г()з!)) параллельно с 0(б()ч!)) дает О(шах((()ч!), входного набора.
Это, очевидно, должно означать, секунд. обходимы для обработки их функцией атгсвр. Если вы (!Ч))) что такой алгоритм не обрабатывает весь входной расширяете входной набор для включения в него боль- На рис. 3.1 показаны графики изменения времени Но подождите, может быть это то же самое, что и набор. Например, это может быть просто усредне- шего числа студентов (например, всей районной шко- (по вертикальной оси), соответствующего рассмотрен- для 0-нотации последовательных алгоритмов? Да, это ние первых пяти элементов н игнорирование осталь- лы), вам нужно также взять в расчет первое имя и средных.
ным выше О-нотациям, а зависимости от количества ний инициал, и функция атгсшр может просматривать так. В идеале преимушества от распараллеливания алэлементов входного набора, т.е. от числа )Ч (по горизон- горитмов проявляются при распрелелении задачи меж- лишь несколько значимых символов а каждом имени, ° 0(!об )Ч). Часто упоминается как логарифмический тальной оси). ду несколькими процессорами. Для любого компьюте- перед тем как сделать опрелеление. (1обагйбгпье) алгоритм; основание логарифма отбро- ра количество доступных процессоров фиксировано, шено (оно становится константой).
Многие алгорит- Немного арифметики поэтому, отбрасывая константы 0-нотаций каждого мы поиска являются 0(1оя )ч!)-алгоритмами. Напри- процесса, в результате мы получим более высокий (от- В реальном мире ваша С-программа представляет собой мер, двоичный целевой поиск на сортированном части поразительный) результат з р~н) коллекцию нескольких несвязанных алгоритмов. Как вы входном наборе имел бы тип О(1оя )Ч), и- «н Хорошо, но ведь мы только программисты и отнюдь можете установить 0-нотацию для всей программы или ° 0(Н).
Часто называемый линейным (1!пеаг), этот ал- ...,.. ' '. ' ',, ': .: —.,-,, нн„н для части программы, которую используют многие ал- ие сильные математики. Как под всем этим подвести горитм занимает время, которое прямо пропорцио- горитмы? Во-первых, выясните, что представляется черту? Мы приходим к тому, что в основе метода 0- нально размеру входного набора. В основном любой числом )ч! в формуле О-нотации. Если вы обра атывае- нотации лежит идея о том, что самый внутренний цикл алгоритм, требующий просмотра каждого элемента наиболее критической части вашего алгоритма являет- те записи платежной ведомости, возможно, — это Оитиммятия //ереемотлемиы0 яэык С Часть 1 Глава 3 0.51 57.66 1/1 вали [3] Профили обеспечивают объективное отображение Следующим шагом является практическая проверка [4] 46.2 0.51 57.66 1 ЬпЬЫевогс [4] мест расположения и причин узких мест в вашей про- выбранного вами алгоритма.
Далее мы обсулим пути 28. 32 29. 25 2739025/2739025 савраге [5] грамме. Эту информацию вы можете целенаправленно повышения скорости работы программы на алгоритмиввар [20] использовать для оптимизации именно этих проблем- ческом уровне. — -- — ных областей в вашей программе. [[иклы, влоэкенные внутрь циклов (вложенных внутрь других циклов, и тш.)...
Каждый уровень вло- 2В.32 29.25 2739025/2739025 ЬпЬЫевогг [4] Алгоритмические стратегии :кенности цикла увеличивает значение экспоненты в О- [5] 45.7 28.32 29.25 2739025 совраге [5] нотации для вашего алгоритма (а это, как мы знаем, 16.90 0.00 208082307/208082387 Сопррег [6] оптимизации очень плохо). К сожалению, я не могу дать вам ника- 0.60 5.41 5470050/5479709 ва11ае [7] 3.24 0.00 5478050/5481361 всг1еп [9] Создавая свою программу, вы, веровтно, столкнулись с ких жестких и четких правил, позволяющи т ких жестких и четких п авил, позволяюших снизить 0.42 1.69 5478050/5478052 ггее [12 проблемой выбора используемых в программе алгорит- уРовень вложенности алгоритмов вообще.
Каждый ал- 0.73 0.00 2739025/2739025 вггевр [14] мов Теле ь было бы хорошо пересмотреть выбор этих горитч имеет свои собственные особенности, и иногда алгоритмов с точки зрения оптимизации всей програм- действительно ничего нельзя слелать, чтобы уменьшить уровень вложенности имеюшихся в нем циклов. Но Показанный в этой таблице профиль содержит три юшими, зе же, которые появляются ниже ее, — это мы и расслштрсть возмо:кность залэены их дру~ ими, возчоэкно, по крайней мере, устранить любые циклы, кораздела, в которых подытожено время выполнения и вызываемые функции.