Оптимізація (інформатика)

Оптимізація — модифікація системи для вдосконалення її ефективності. Система може бути одиночною комп'ютерною програмою, набором комп'ютерів або навіть цілою мережею, такою як Інтернет.

Хоча метою оптимізації є отримання оптимальної системи, істинно оптимальна система в процесі оптимізації досягається далеко не завжди. Оптимізована система зазвичай є оптимальною тільки для однієї задачі або групи користувачів: десь може бути важливіше зменшення часу, необхідного програмі для виконання роботи, навіть ціною споживання більшого обсягу пам'яті; в додатках, де важливіше пам'ять, можуть вибиратися більш повільні алгоритми з меншими запитами до пам'яті.

Більш того, часто не існує універсального рішення, яке працює добре у всіх випадках, тому інженери використовують компромісні (англ. tradeoff) рішення для оптимізації лише ключових параметрів. До того ж, зусилля, необхідні для досягнення повністю оптимальної програми, яку неможливо далі поліпшити, практично завжди перевищують вигоду, яка може бути від цього отримана, тому, як правило, процес оптимізації завершується до того, як досягається повна оптимальність. На щастя, в більшості випадків навіть при цьому досягаються помітні поліпшення.

Оптимізація повинна проводитися з обережністю. Тоні Гоара вперше вимовив, а Дональд Кнут згодом часто повторював відомий вислів: «Передчасна оптимізація — це корінь всіх бід». Дуже важливо мати для початку озвучений алгоритм і працюючий прототип.

Основи

Деякі завдання часто можуть бути виконані більш ефективно. Наприклад, програма на мові Сі, яка підсумовує всі цілі числа від 1 до N:

int i, sum = 0;
for (i = 1; i <= N; i++)
  sum += i;

Маючи на увазі, що тут немає переповнення, цей код може бути переписаний у наступному вигляді за допомогою відповідної математичної формули:

int sum = (N * (N+1)) / 2;

Поняття «оптимізація» зазвичай передбачає, що система зберігає ту ж саму функціональність. Однак, значне поліпшення продуктивності часто може бути досягнуто і за допомогою видалення надлишкової функціональності. Наприклад, якщо припустити, що програмі не потрібно підтримувати більш, ніж 100 елементів при введенні, то можливо використовувати статичну виділення пам'яті замість більш повільного динамічного.

Компроміси (tradeoff)

Оптимізація в основному фокусується на одиничному або повторному часу виконання, використання пам'яті, дискового простору, пропускної здатності або деякому іншому ресурсі. Це звичайно вимагає компромісів — один параметр оптимізується за рахунок інших. Наприклад, збільшення розміру програмного кешу чого-небудь покращує продуктивність часу виконання, але також збільшує споживання пам'яті. Інші поширені компроміси включають прозорість коду та його виразність, майже завжди ціною деоптимізації. Складні спеціалізовані алгоритми вимагають більше зусиль по налагодженню і збільшують ймовірність помилок.

Різні області

У дослідженні операцій, оптимізація — це проблема визначення вхідних значень функції, при яких вона має максимальне або мінімальне значення. Іноді на ці значення накладаються обмеження, така задача відома як обмежена оптимізація.

У програмуванні, оптимізація зазвичай позначає модифікацію коду і його налаштувань компіляції для даної архітектури для виробництва більш ефективного ПО.

Типові проблеми мають настільки велику кількість можливостей, що програмісти зазвичай можуть дозволити використовувати тільки «досить хороше» рішення.

Вузькі місця

Для оптимізації потрібно знайти вузьке місце (англ. bottleneck — пляшкове горлечко): критичну частину коду, яка є основним споживачем необхідного ресурсу. Поліпшення приблизно 20 % коду іноді тягне за собою зміну 80 % результатів (див. також принцип Парето). Для пошуку вузьких місць використовуються спеціальні програми — Профайлер. Витік ресурсів (пам'яті, дескрипторів тощо) також може призвести до падіння швидкості виконання програми, для їх знаходження також застосовуються спеціальні програми (наприклад, BoundsChecker[en]).

Архітектурний дизайн системи особливо сильно впливає на її продуктивність. Вибір алгоритму впливає на ефективність більше, ніж будь-який інший елемент дизайну. Більш складні алгоритми і структури даних можуть добре оперувати з великою кількістю елементів, в той час як прості алгоритми підходять для невеликих обсягів даних — накладні витрати на ініціалізацію більш складного алгоритму можуть переважити вигоду від його використання.

Чим більше пам'яті використовує програма, тим швидше вона зазвичай виконується. Наприклад, програма-фільтр зазвичай читає кожен рядок, фільтрує і виводить цей рядок безпосередньо. Тому вона використовує пам'ять тільки для зберігання одного рядка, але її продуктивність зазвичай дуже погана. Продуктивність може бути значно поліпшена читанням цілого файлу і записом потім відфільтрованого результату, проте цей метод використовує більше пам'яті. Кешування результату також ефективно, проте вимагає більшої кількості пам'яті для використання.

Прості прийоми оптимізації програм за витратами процесорного часу

Оптимізація за витратами процесорного часу особливо важлива для розрахункових програм, в яких велику питому вагу мають математичні обчислення. Тут наведені деякі прийоми оптимізації, які може використовувати програміст при написанні вихідного тексту програми.

Ініціалізація об'єктів даних

У багатьох програмах якусь частину об'єктів даних необхідно ініціалізувати, тобто присвоїти їм початкові значення. Таке присвоювання виконується або на самому початку програми, або, наприклад, в кінці циклу. Правильна ініціалізація об'єктів дозволяє заощадити дорогоцінний процесорний час. Так, наприклад, якщо мова йде про ініціалізації масивів, використання циклу, швидше за все, буде менш ефективним, ніж оголошення цього масиву прямим присвоєнням.

Програмування арифметичних операцій

У тому випадку, коли значна частина часу роботи програми відводиться арифметичним обчислень, чималі резерви підвищення швидкості роботи програми полягають у правильному програмуванні арифметичних (та логічних) виразів. Важливо, що різні арифметичні операції значно розрізняються по швидкодії. У більшості архітектур найшвидшими є операції додавання і віднімання. Повільнішим є множення, потім йде ділення. Наприклад, обчислення значення виразу , де  — константа, для аргументів з рухомою комою виробляється швидше у вигляді , де  — константа, що обчислюється на етапі компіляції програми (фактично повільна операція ділення замінюється швидкою операцією множення). Для цілочисельного аргументу обчислення виразу швидше порахувати у вигляді (операція множення замінюється операцією додавання) або з використанням операції зсуву вліво (що забезпечує виграш не на всіх процесорах). Подібні оптимізації називаються зниженням вартості операцій. Множення цілочисельних аргументів на константу на процесорах сімейства x86 може бути ефективно виконана з використанням асемблерних команд LEA, SHL и ADD замість використання програм MUL/IMUL:

; Вихідний операнд в регістрі EAX
ADD EAX, EAX ; множення на 2

LEA EAX, [EAX + 2*EAX] ; множення на 3

SHL EAX, 2 ; множення на 4

LEA EAX, [4*EAX] ; інакший варіант реалізації множення на 4

LEA EAX, [EAX + 4*EAX] ; множення на 5

LEA EAX, [EAX + 2*EAX] ; множення на 6
ADD EAX, EAX

; і т.п.

Подібні оптимізації є мікроархітектурними і зазвичай проводяться оптимізуючим компілятором прозоро для програміста.

Відносно багато часу витрачається на звернення до підпрограм (передача параметрів через стек, збереження регістрів і адреси повернення, виклик конструкторів копіювання). Якщо підпрограма містить малу кількість дій, вона може бути реалізована підставлянням (англ. inline) — всі її оператори копіюються в кожне нове місце виклику (існує ряд обмежень на inline-підстановки: наприклад, підпрограма не повинна бути рекурсивною). Це ліквідує накладні витрати на звернення до підпрограмі, проте веде до збільшення розміру виконуваного файлу. Саме по собі збільшення розміру виконуваного файлу не є суттєвим, проте в деяких випадках виконуваний код може вийти за межі кешу команд, що спричинить значне падіння швидкості виконання програми. Тому сучасні оптимізують компілятори зазвичай мають налаштування оптимізації за розміром коду і по швидкості виконання.

Швидкодія також залежить і від типу операндів. Наприклад, у мові Turbo Pascal, через особливості реалізації цілочисельний арифметики, операція додавання виявляється найбільш повільною для операндів типу Byte і ShortInt : попри те, що змінні займають один байт, арифметичні операції для них двобайтові і при виконанні операцій над цими типами проводиться обнулення старшого байта регістрів і операнд копіюється з пам'яті в молодший байт регістра. Це і призводить до додаткових витрат часу.

Програмуючи арифметичні вирази, варто вибирати таку форму їх запису, щоб кількість «повільних» операцій було зведено до мінімуму. Розглянемо такий приклад. Нехай необхідно обчислити багаточлен 4-го ступеня:

За умови, що обчислення ступеня проводиться перемножуванням підстави певну кількість разів, неважко знайти, що в цьому виразі міститься 10 множень («повільних» операцій) і 4 складання («швидких» операцій). Це ж саме вираз можна записати у вигляді:

Така форма запису називається схемою Горнера. У цьому виразі 4 множення та 4 складання. Загальна кількість операцій скоротилася майже в два рази, відповідно зменшиться і час обчислення багаточлена. Подібні оптимізації є алгоритмічними і зазвичай не виконується компілятором автоматично.

Цикли

Розрізняється і час виконання циклів різного типу. Час виконання циклу з лічильником і циклу з постусловіем при всіх інших рівних умовах збігається, цикл з передумовою виконується декілька довше (приблизно на 20-30 %).

При використанні вкладених циклів слід мати на увазі, що витрати процесорного часу на обробку такої конструкції можуть залежати від порядку проходження вкладених циклів. Наприклад, вкладений цикл з лічильником на мові Turbo Pascal:

   for j := 1 to 100000 do
      for k := 1 to 1000 do a := 1;
   for j := 1 to 1000 do
      for k := 1 to 100000 do a := 1;

Цикл в лівій колонці виконується приблизно на 10 % довше, ніж у правій.

На перший погляд, і в першому, і в другому випадку 10 000 000 разів виконується оператор присвоювання і витрати часу на це мають бути однакові в обох випадках. Але це не так. Пояснюється це тим, що ініціалізації циклу (обробка процесором його заголовка з метою визначення початкового і кінцевого значень лічильника, а також кроку приросту лічильника) вимагає часу. У першому випадку 1 раз ініціалізується зовнішній цикл і 100 000 разів — внутрішній, тобто всього виконується 100001 ініціалізація. У другому випадку таких ініціалізацій виявляється всього лише 1001.

Аналогічно поводяться вкладені цикли з передумовою і з постумовою. Можна зробити висновок, що при програмуванні вкладених циклів по можливості слід робити цикл з найбільшим числом повторень самим внутрішнім, а цикл з найменшим числом повторень — самим зовнішнім.

Якщо в циклах містяться звернення до пам'яті (зазвичай при обробці масивів), для максимально ефективного використання кешу і механізму апаратної предвибірки даних з пам'яті (англ. Hardware Prefetch) порядок обходу адрес пам'яті повинен бути по можливості послідовним. Класичним прикладом подібної оптимізації є зміна порядку проходження вкладених циклів при виконанні множення матриць.

При обчисленні сум часто використовуються цикли, що містять однакові операції, що відносяться до кожного доданку. Це може бути, наприклад, загальний множник (мова Turbo Pascal):

  sum := 0;
  for i := 1 to 1000 do
    sum := sum + a * x[i];
  sum := 0;
  for i := 1 to 1000 do
    sum := sum + x[i];
  sum := a * sum;

Друга форма запису циклу виявляється економнішою.

Див. також


Read other articles:

Williams di pawai Occupy Wall Street pada 2012 Jumaane D. Williams (/dʒuˈmɑːni/ joo-MAH-nee; lahir 11 Mei 1976) adalah seorang politikus asal Amerika Serikat yang menjabat sebagai Advokat Publik New York City sejak 2019. Ia adalah anggota Partai Demokrat dan menyebut dirinya sendiri sebagai seorang sosialis demokrat.[1] Referensi ^ Day, Meagan. I Have No Problem Saying I'm a Democratic Socialist. jacobinmag.com. Diakses tanggal 1 March 2019.  Pranala luar Wikimedia Commons me...

 

Provinsi Spania. Spania (Latin: Provincia Spaniaecode: la is deprecated ) adalah provinsi Kekaisaran Bizantium dari tahun 552 hinggal 624[1] di Kepulauan Balearik dan sebelah selatan Semenanjung Iberia. Provinsi ini merupakan salah satu dari wilayah bekas Romawi Barat yang berhasil direbut kembali oleh Kaisar Romawi Timur (Bizantium) Yustinianus I dalam usahanya untuk menaklukan kembali wilayah Romawi Barat yang hilang. Pada tahun 624, provinsi ini berhasil direbut kembali oleh Visigo...

 

Advocates of some early Mormon doctrines Not to be confused with the conservative RLDS splinter groups, the Restoration Branches. Teenagers from polygamous families demonstrate at a pro-plural marriage rally in Salt Lake City in 2006. Over 200 supporters attended the event.[1] Mormonism and polygamyA Mormon Saint and Wives by Charles Weitfle (ca.1878–1885) Early MormonismJoseph Smith • Wives of Joseph Smith • Origin of Latter Day Saint polygamy ...

Musical FameThe MusicalShow logoMusicSteve MargoshesLyricsJacques LevyBookJose FernandezBasisFilm Fame by Christopher GoreProductions1988 Miami1995 West End1996 UK Tour1997 West End1998 West End1998 US Tour2000 UK Tour2000 West End2001 US Tour2001 UK Tour2003 US Tour2004 UK Tour2007 UK Tour2007 West End2014 UK Tour2018 UK Tour2019 UK Tour Fame is a stage musical based on the 1980 musical film of the same name, with book by Jose Fernandez, music by Steve Margoshes and lyrics by Jacques Levy. C...

 

Hungarian footballer, manager, and scout The native form of this personal name is Kiprich József. This article uses Western name order when mentioning individuals. József Kiprich Kiprich in 1997Personal informationFull name József KiprichDate of birth (1963-09-06) 6 September 1963 (age 60)Place of birth Tatabánya, HungaryHeight 1.80 m (5 ft 11 in)Position(s) StrikerYouth career Tatabányai BányászSenior career*Years Team Apps (Gls)1980–1989 Tatabányai Bányás...

 

Ismaël Bullialdus Ismaël Bullialdus o Boulliau (Loudun, 28 settembre 1605 – Parigi, 25 novembre 1694) è stato un astronomo e presbitero francese. Indice 1 Biografia 1.1 Attività di astronomo 2 Opere 3 Note 4 Altri progetti 5 Collegamenti esterni Biografia Opus novum ad arithmeticam infinitorum libris sex comprehensum, 1682 Era figlio di genitori di fede calvinista e suo padre, di professione notaio, era un astronomo dilettante che lo iniziò alla passione per il cielo stellato. All'età...

American college basketball season 2023–24 Arkansas Razorbacks men's basketballConferenceSoutheastern ConferenceRecord16–17 (6–12 SEC)Head coachEric Musselman (5th season)Assistant coaches Anthony Ruta (2nd season) Todd Lee (1st season) Ronnie Brewer (1st season) Michael Musselman (1st season) Keith Smart (3rd season) Home arenaBud Walton Arena(Capacity: 19,368)Seasons← 2022–232024–25 → 2023–24 Southeastern Conference men's basketball standings vte ...

 

Native American tribe For other uses, see Hopi (disambiguation). Hopi TribeHopisinomA Hopi girl with a customary Hopi squash blossom hairstyle, woven wearing blanket, jewelry, and an olla.Total population19,338 (2010)[1]Regions with significant populationsUnited States (Arizona)LanguagesHopi, EnglishReligionIndigenous religionRelated ethnic groupsPueblo peoples, Uto-Aztecan peoples PeopleHopiLanguageHopilàvayi,Hand TalkCountryHopitutskwa The Hopi are Native Americans who primarily li...

 

XX secolo · XXI secolo · XXII secolo Anni 1980 · Anni 1990 · Anni 2000 · Anni 2010 · Anni 2020 2000 · 2001 · 2002 · 2003 · 2004 · 2005 · 2006 · 2007 · 2008 · 2009 Gli anni 2000 sono il decennio che comprende gli anni dal 2000 al 2009 inclusi. A cavallo tra il secondo e il terzo millennio, ovvero primo decennio del XXI secolo, è stato definito il decennio breve per la velocità delle innova...

この項目には、一部のコンピュータや閲覧ソフトで表示できない文字が含まれています(詳細)。 数字の大字(だいじ)は、漢数字の一種。通常用いる単純な字形の漢数字(小字)の代わりに同じ音の別の漢字を用いるものである。 概要 壱万円日本銀行券(「壱」が大字) 弐千円日本銀行券(「弐」が大字) 漢数字には「一」「二」「三」と続く小字と、「壱」「�...

 

Nordhastedt Lambang kebesaranLetak Nordhastedt di Dithmarschen NegaraJermanNegara bagianSchleswig-HolsteinKreisDithmarschen Municipal assoc.KLG Heider UmlandSubdivisions3Pemerintahan • MayorJürgen Hinz (CDU)Luas • Total26,56 km2 (1,025 sq mi)Ketinggian11 m (36 ft)Populasi (2013-12-31)[1] • Total2.754 • Kepadatan1,0/km2 (2,7/sq mi)Zona waktuWET/WMPET (UTC+1/+2)Kode pos25785Kode area telepon04804Pelat ke...

 

Questa voce sull'argomento attori statunitensi è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Daphne Ashbrook Daphne Ashbrook (Long Beach, 30 gennaio 1963) è un'attrice statunitense. Indice 1 Biografia 2 Filmografia parziale 2.1 Cinema 2.2 Televisione 3 Doppiatrici italiane 4 Collegamenti esterni Biografia È particolarmente conosciuta per aver interpretato il ruolo di Dawn Atwood, la madre di Ryan i...

Si ce bandeau n'est plus pertinent, retirez-le. Cliquez ici pour en savoir plus. Cet article ne cite pas suffisamment ses sources (février 2021). Si vous disposez d'ouvrages ou d'articles de référence ou si vous connaissez des sites web de qualité traitant du thème abordé ici, merci de compléter l'article en donnant les références utiles à sa vérifiabilité et en les liant à la section « Notes et références ». En pratique : Quelles sources sont attendues ? ...

 

Provincial park in Ontario, Canada Kawartha Highlands Provincial ParkIUCN category II (national park)Copper Lake in Kawartha Highlands Provincial ParkShow map of Southern OntarioShow map of OntarioLocationOntario, CanadaNearest cityPeterborough, OntarioCoordinates44°45′N 78°15′W / 44.750°N 78.250°W / 44.750; -78.250Area375.87 km2 (145.12 sq mi)[1]Established1999, expanded in 2003Governing bodyOntario Parks Kawartha Highlands Pro...

 

Vowel sound represented by ⟨œ⟩ in IPA Open-mid front rounded vowelœIPA Number311Audio sample source · helpEncodingEntity (decimal)&#339;Unicode (hex)U+0153X-SAMPA9Braille Image IPA: Vowels Front Central Back Close i y ɨ ʉ ɯ u Near-close ɪ ʏ ʊ Close-mid e ø ɘ ɵ ɤ o Mid e̞ ø̞ ə ɤ̞ o̞ Open-mid ɛ œ ɜ ɞ ʌ ɔ Near-open æ ɐ Open a ɶ ä ɑ ɒ IPA help  audio full chart template Legend: unrounded • rounded Spectrogram of œ The open...

2003 television fantasy film For the 2018 Disney film, see A Wrinkle in Time (2018 film). For the novel, see A Wrinkle in Time. A Wrinkle in TimeDVD coverBased onA Wrinkle in Timeby Madeleine L'EngleWritten bySusan Shilliday (teleplay)Directed byJohn Kent HarrisonStarringKatie StuartGregory SmithDavid DorfmanChris PotterKyle SecorSeán CullenSarah-Jane RedmondKate NelliganAlison ElliotAlfre WoodardTheme music composerJeff Danna (film version)Patric Caird (four-hour miniseries cut)Shawn Pierce...

 

Bebukaran Turpinia Turpinia malabaricaTaksonomiKerajaanPlantaeDivisiTracheophytaOrdoCrossosomatalesFamiliStaphyleaceaeGenusTurpinia Bonpl., 1807 Tata namaSinonim takson Eyrea Champ. ex Benth. Jahnia Pittier & S.F.Blake Lacepedea Kunth Ochranthe Lindl. Triceraia Willd. ex Roem. & Schult. Triceros Lour. [1] Bebukaran (Turpinia) adalah genus pohon dan perdu dalam keluarga Staphyleaceae, berasal dari Asia dan Amerika Utara, Tengah, dan Selatan. [2] Hingga December 2023[...

 

Ice hockey team in North Richland Hills, TexasFort Worth BrahmasCityNorth Richland Hills, TexasLeagueCentral Hockey LeagueConferenceBerryFounded1997 (In the WPHL)Home arenaNYTEX Sports CentreColorsBlack, PurpleFranchise history1997–2006Fort Worth Brahmas2007–2012Texas Brahmas2012–2013Fort Worth BrahmasChampionshipsRegular season titles1997-98 Governors Cup ChampionsDivision titles2007-08 Northeast Division Champs, 2008-09 Southeast Division ChampsConference titles2008-09 Southern Confer...

Questa voce sull'argomento calciatori colombiani è solo un abbozzo. Contribuisci a migliorarla secondo le convenzioni di Wikipedia. Segui i suggerimenti del progetto di riferimento. Fabry CastroNazionalità Colombia Altezza183 cm Peso74 kg Calcio RuoloCentrocampista Squadra Atlético Bucaramanga CarrieraSquadre di club1 2013 Deportivo Pasto10 (0)2014 Guarani2 (0)2015-2017 Rayo Majadahonda53 (2)2017-2018 Servette44 (1)2018-2021 PAS Giannina53 (3)2021-2...

 

American ice dancer Jerod SwallowPunsalan and Swallow in 2002.Born (1966-10-18) October 18, 1966 (age 57)Ann Arbor, MichiganHeight1.78 m (5 ft 10 in)Figure skating careerCountryUnited StatesSkating clubDetroit Skating ClubRetired1998 Jerod Swallow (born October 18, 1966) is an American ice dancer. With his wife Elizabeth Punsalan, he is a five-time U.S. national champion, two-time Skate America champion, and competed twice in the Winter Olympics. Personal life Swallow was ...