У часи сучасних обчислень, у "типових ділових додатках" - чому важлива ефективність? [зачинено]


29

Для когось із вас це може здатися дивним питанням.

Я хобі-програміст Java. Я розробив кілька ігор, програму AI, яка створює музику, іншу програму для малювання тощо. Це вам скаже, що я маю досвід програмування, але не в професійному розвитку бізнес-додатків.

Я бачу багато розмов на цьому сайті про продуктивність. Люди часто обговорюють, який би був найефективніший алгоритм в C # для виконання завдання, або чому Python повільний, а Java швидша тощо.

Я намагаюся зрозуміти: чому це має значення?

Є конкретні області обчислень, де я розумію, чому важлива продуктивність: ігри, де десятки тисяч обчислень відбуваються щосекунди в циклі постійного оновлення, або системи низького рівня, на які покладаються інші програми, такі як ОС та Віртуальний комп'ютер тощо.

Але для звичайних, типових бізнес-додатків високого рівня, чому важлива ефективність?

Я можу зрозуміти, чому це мало значення десятиліттями тому. Комп'ютери були набагато повільнішими і мали набагато менше пам’яті, тому вам довелося ретельно продумати ці речі.

Але сьогодні у нас стільки пам’яті запам'ятовується, а комп’ютери так швидко: чи це насправді важливо, якщо певний алгоритм Java є O (n ^ 2)? Чи насправді це змінить для кінцевих користувачів цього типового ділового додатка?

Коли ти тиснуш кнопку GUI у типовому бізнес-додатку і за лаштунками запускає алгоритм O (n ^ 2), в ці дні сучасних обчислень - ти насправді відчуваєш свою неефективність?

Моє запитання розділено на два:

  1. На практиці, чи сьогодні важлива робота в типовій звичайній бізнес-програмі?
  2. Якщо це так, будь ласка, наведіть мені приклади реального світу місць у такій програмі, де важлива ефективність та оптимізація.


Продуктивність має значення, якщо вона погана.
Майк Данлаве

Відповіді:


40

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

  • Вони здебільшого передчасна оптимізація . Зазвичай, хтось хоче "найшвидший спосіб" зробити операцію без видимих ​​причин, і в кінцевому підсумку або вносить зміни коду, які в будь-якому випадку вносяться більшістю компіляторів (наприклад, заміна поділу на множення чи вбудований метод), або витрачає дні на внесення змін що допоможе отримати кілька мікросекунд під час виконання.

  • Вони часто є умоглядними . Я радий бачити, що в Stack Overflow та Programmers.SE профайлінг часто згадується, коли питання стосується продуктивності, але я також розчарований, коли бачу двох програмістів, які не знають, що профілювання обговорюють про ефективність, пов'язані зміни, які вони повинні внести у свій код. Вони вірять, що зміни зроблять все швидше, але практично кожен раз це не матиме видимого ефекту або сповільнюватиме роботу, тоді як профайлер вказував би їх на іншу частину коду, яку легко оптимізувати та витрачає на 80% того часу.

  • Вони зосереджені лише на технічних аспектах. Виконання програм, орієнтованих на користувачів, стосується почуття: чи відчувається він швидкий та чуйний, чи відчуває себе повільним і незграбним? У цьому контексті проблеми продуктивності зазвичай вирішуються набагато краще дизайнерами з досвіду користувача: простий анімований перехід часто може бути різницею між додатком, який відчуває себе дуже повільно, і додатком, який відчуває чуйність, а обидва витрачають 600 мс. робити операцію.

  • Вони ґрунтуються на суб'єктивних елементах, навіть коли вони пов'язані з технічними обмеженнями. Якщо це не питання почуття швидкого та чуйного реагування, має бути нефункціональна вимога, яка визначає, як швидко операція повинна виконуватися на конкретних даних, що працюють на певній системі . Насправді це буває більше подібного: менеджер каже, що він знаходить щось повільне, і тоді розробникам потрібно розібратися, що це означає. Це повільно, як у "воно повинно бути нижче 30 мс. В даний час воно витрачає десять секунд", або повільно, як "ми можемо скоротити тривалість з десяти до дев'яти секунд"?

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

Я чув такі терміни, як "профілювання" або "орієнтир", але я не знав, що вони означають, і не міг би турбуватися менше. Більше того, я був занадто зосереджений, читаючи книгу про С, і особливо главу, де обговорювались методи оптимізації. Коли я виявив, що комп’ютери виконують множення швидше, ніж ділення, я замінив ділення на множення де завгодно. Коли я виявив, що виклик методу може бути повільним, я поєднав стільки методів, скільки міг, наче попередні 100 методів LOC вже не були проблемою.

Іноді я проводив ночі, роблячи зміни, які, я переконався, різнилися між повільним додатком, який ніхто не хоче, і швидким, який всі хочуть завантажувати та використовувати. Той факт, що два реальних клієнта, які зацікавились цим додатком, запитували фактичні функції, мене не турбує: "Хто хотів би функцію, якщо додаток повільний?" - подумав я.

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

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

Це, як говорять, важлива в цілому :

  • У некомерційних додатках це може стати вирішальним. Існує вбудоване програмне забезпечення , програмне забезпечення працює на серверах (коли у вас є кілька тисяч запитів в секунду, що не таке вже й велике, продуктивність починає викликати занепокоєння), програмне забезпечення працює на смартфонах , відеоіграх , програмному забезпеченні для професіоналів (спробуйте впоратися 50 Гб файл у Photoshop на не дуже швидкій машині, про що можна переконатись, і навіть звичайні програмні продукти, які продаються багатьом людям (якщо Microsoft Word витрачає вдвічі більше часу на кожну операцію, яку він робить, втрачений час множиться на число користувачів стане проблемою).

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


4
Відмінна відповідь, особливо тому, що зосередити увагу на безглуздих дискусіях щодо виконання та безглуздих оптимізаціях.
Док Браун

1
a simple animated transition may often be the difference between an app which feels terribly slow and the app which feels responsive- хоча їх, безумовно, слід використовувати економно, для додатків, які засмічують анімацію та переходи скрізь, можуть бути неприємними, якщо дивитись на ці переходи щодня!
Cosmic Ossifrage

яке джерело вашої цитати?
Адам Джонс

1
@AdamJohns: джерела немає. Це цитується з проектів моїх власних статей, які ще не опубліковані в моєму блозі.
Арсеній Муренко

@MainMa О, дивовижно. Мені дуже сподобалася ця маленька ілюстрація вашої точки зору.
Адам Джонс

44

Так. Так. Швидкість запуску - не єдина турбота, яку ви маєте викликати, і це не так актуально, як це було в 1982 році, або як це все ще є в вбудованих малопотужних системах, але це завжди турбота, і важливо, щоб ви розуміли чому це так.

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

Крім того, ознайомтеся з основами досвіду роботи користувачів. Існують добре досліджені пороги, які визначають, як сприймається взаємодія з програмою залежно від часу її реакції (10 мс, 100 мс, кілька секунд тощо). Перетинання одного з цих порогових значень призведе до відмови користувачів від вашої програми, і якщо ви не будете щасливі писати монопольне програмне забезпечення, яке люди повинні використовувати, відключені користувачі перекладають безпосередньо на негативну ділову цінність, оскільки це призводить до втрати клієнтів.

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


2
Ще одне, що потрібно пам’ятати про вибір алгоритму: завдяки бібліотекам та абстракціям багато варіантів альго було зроблено вже для вас або принаймні «під капотом». Ви все ще повинні знати їх вплив на продуктивність. І ця робота має значення .
joshin4colours

14

Так!

Оскільки ви попросили прикладів, на думку приходить декілька ситуацій щодня:

  1. Обробка великих даних : Багато бізнес-додатків підтримуються базами даних, і в багатьох випадках ці бази даних переповнюються даними. А оскільки простір на диску є дешевим, обсяг записаних і збережених даних є божевільним. Лише минулого тижня замовник скаржився, що його додаток настільки повільний, коли відображається лише середня кількість (запити понад мільйон рядків ...) - Також у щоденному використанні ми маємо перетворення пакетних даних та розрахунків із часом виконання в лізі кількох годин. Минулого року алгоритмічна оптимізація принесла час роботи однієї партії з 8 до 4 годин, тепер вона вже не стикається зі зміною дня!

  2. Відповідальність : Були проведені дослідження зручності користування (якщо я встигну, я додаю посилання на відповідні запитання на ux.se ...), що задоволення користувачів сильно пов'язане з чуйністю. Різниця в часі відгуку 200 мс проти 400 мс може легко коштувати вам великого відсотка клієнтів, залишаючи вас для своїх конкурентів.

  3. Вбудовані системи : Комп'ютери не стають швидшими, вони стають повільнішими і меншими ^ _ ^ Мобільний розвиток має величезний вплив на розробку додатків. Звичайно, ми можемо обміняти цикли пам'яті та процесора, як Jelly Beans, на сучасних настільних комп’ютерах, але тепер ваш начальник просить вас реалізувати алгоритм аналізу сну на дивних годинниках або на SIM-картці ...


4

На практиці, чи сьогодні важлива робота в типовій звичайній бізнес-програмі?

Я не знаю, що є типовою звичайною діловою програмою. Що я знаю, це те, що користувачі завжди закінчують, подаючи наші програми набагато більшою кількістю даних, ніж ми планували (часто після того, як вони дотягнуть їх, наскільки це буде великим і додавши запас безпеки), і що в такому випадку вони очікують лінійного збільшення рівня час виконання, прийміть поведінку в журналі n і скаржаться, що програма зависає, коли щось інше відбувається. І вони, як правило, вважають розмір результату більше, ніж розмір вхідного винятку, якщо в їх POV очевидно, що всі вхідні дані мають бути оброблені.

Тож так, продуктивність, принаймні на рівні складності, має значення. Мікрооптимізація всередині класу складності насправді не має значення, крім випадків, коли ви помітно гірші, ніж конкуренція (або в орієнтирах на деяких ринках, або внаслідок сприйняття сировини - зміна класу в процесі прогресування "миттєве", "не миттєве, але користувач не робить 'не переходити на щось інше', "досить повільно, що користувач переходить на щось інше, ризикуючи перервати потік дій", "досить повільно, що користувач запустить завдання, а потім час від часу перевіряє", "досить повільно що користувач планує запустити завдання під час обіду, протягом ночі, впродовж тижня ").


4

У сучасних бізнес-програмах проблеми з роботою не полягають у браку процесора чи пам'яті. Але вони у формі мережевих затримок, продуктивність вводу / виводу та абстракції, які приховують все це. Все залежить від того, наскільки хороший дизайн і наскільки досвідчені розробники. Навіть проста програма CRUD може скануватись, якщо вона витягується з БД по одному рядку, а не виконує запит (також відомий як проблема N + 1).

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


3

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


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

3
Ви оптимізуєте лише один раз, але платите за електроенергію щомісяця.
Джейді

2
@JanHudec: Я не зовсім розумію, як можна реально сказати, що з прямим обличчям, коли той самий веб-сайт, на якому ви зараз перебуваєте (наша дорога біржа стеків), обслуговує 560M переглядів сторінок щомісяця по всьому світу, працює лише на 25 серверах .
Мехрдад

2
@Mehrdad: І вони могли замість цього записати в C, і, можливо, запустили його на 20 серверах замість 25. Але вони цього не зробили, оскільки економія не перевершить збільшення часу розробки. Багато веб-сервісів реалізовані в Python та PHP, деякі з найбільш повільних загальних мов, але ніхто не думає їх переписати чим-небудь швидше, оскільки збільшений час розробки не окупиться. Постійні фактори більшість часу вирішуються, просто кидаючи на нього більше обладнання. Проблеми з масштабуванням (асимптотиками) - інша справа.
Ян Худек

3
... І, справедливо кажучи, база даних, яка саме робить більшу частину бурхливої ​​роботи, була написана та оптимізована для швидкого просування.
Blrfl

3

Це, безумовно, має велике значення.

Основна проблема навіть не в тому, що дратує користувача, наприклад, у виникненні непотрібних затримок, коли елементи GUI переоцінюються двічі або тричі (що має значення в інтегрованій графіці!) Або просто тому, що програмі потрібно так багато часу, щоб зробити ... що б це не було робить (переважно нецікаві речі). Хоча, звичайно, це теж питання.

Існує три важливі помилки:

  1. Більшість типових бізнес-комп’ютерів не «набагато потужніші» . Типовий бізнес-комп’ютер - це не 8-ядерний i7 з відкидною графічною картою та 16 ГБ оперативної пам’яті. Це ноутбук із мобільним процесором середнього класу, інтегрованою графікою, 2 ГБ основної пам’яті (4 ГБ, якщо вам пощастить), диску 5400 об / хв та корпоративну версію Windows з різноманітним антивірусом у реальному часі та програмним забезпеченням, що працює в режимі реального часу. тло. Або для більшості консультантів "комп'ютер" - це просто iPhone ...
  2. Більшість "типових бізнес-користувачів" не є технічними фахівцями, вони не розуміють наслідків створення електронної таблиці з 10-12 вкладеними перехресними посиланнями, 150 стовпцями та 30 000 рядками (ці цифри не такі нереальні, як ви можете припустити!), І вони теж не хочу знати. Вони просто це зроблять.
  3. Друге втрачене не коштує - очевидно неправильне припущення.

Моя дружина працює у верхньому кінці такого «типового ділового середовища». Комп'ютер, який вона використовує, коштує приблизно 3,5 години свого робочого часу. Запуск Microsoft Outlook займає - в хороший день - приблизно 3 хвилини до готовності (6-8 хвилин в кінці кварталу, коли сервери знаходяться під великим навантаженням). Деякі з цих згаданих електронних таблиць на 30 рядків потребують 2-3 секунд для оновлення значення, під час якого комп'ютер "заморожений" (не кажучи вже про те, скільки часу потрібно запускати Excel і відкривати їх в першу чергу!). Ще гірше при спільному використанні робочого столу. Навіть не змушуйте мене йти на SAP.
Безумовно, важливо, чи сто тисяч людей втрачають 20-25 хвилин за робочий день, не чекаючи нічого. Це мільйони втраченихякі ви могли б замість того, щоб втратити їх, виплачувати як дивіденди (або виплачувати більшу зарплату).
Звичайно, більшість працівників перебувають на нижньому кінці платної шкали, але навіть у нижній кінець часу це гроші .


3

Я можу зрозуміти, чому це мало значення десятиліттями тому. Комп'ютери були набагато повільнішими і мали значно менше пам’яті, тому вам довелося ретельно продумати ці речі.

Ви, здається, недооцінюєте те, як швидко росте N ^ 2. Скажімо, у нас є комп’ютер, і наш алгоритм N ^ 2 займає 10 секунд, коли N = 10. Час проходить, тепер у нас є новий процесор, який в 6 разів швидший за наш вихідний, тому наше 10-секундне обчислення зараз менше двох секунд. На скільки більше може бути N і все ще вписуватися в цей оригінальний 10-секундний час? Зараз ми можемо обробити 24 предмети, трохи більше вдвічі більше. Наскільки швидше повинна бути наша система, щоб обробити 10 разів більше предметів? Що ж, треба було б у 100 разів швидше. Дані зростають досить швидко і більше, ніж знищують прогрес апаратного забезпечення комп’ютера для алгоритмів N ^ 2.


Інший приклад: Якщо обробка одного елемента займає 30 циклів процесора або 10ns (що досить дешево), алгоритм вже займе повну секунду, якщо у вас є лише 10000 елементів. 10000 елементів не багато в багатьох контекстах.
CodesInChaos

1

Ви б не повірили, що кількість третіх бізнес-програм, які ми використовуємо на роботі, і багато з них просто смішно повільно використовувати порівняно з моїми особистими стандартами. Якби програми були чимось, що я використовую вдома, я б давно замінив їх альтернативною.

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

Прикладом є управління випадками, коли робота вимірюється через 15 хвилинних інтервалів (служба обслуговування). Якщо програма досить повільна, щоб один білет зайняти більше 15 хвилин (включаючи фактичну роботу), це досить сповільнить процес. Однією з причин може бути повільний доступ до бази даних, який просто "чекає деякого часу" щоразу, коли користувач виконує якусь дію (заповніть деталі роздільної здатності, оновіть інформацію про роботу тощо). Я можу собі уявити, що бувають випадки, коли повільні програми можуть впливати навіть на більш критичні речі, такі як деталі пацієнтів у лікарні щодо невідкладних випадків отруєння - можливо алергія на ліки чи таке?


1

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

http://windowsitpro.com/windows-xp/svchost-and-windows-update-windows-xp-still-problem

Пов'язана стаття описує помилку в алгоритмі обчислення оновлень Windows XP. Більшу частину життя Windows XP алгоритм оновлення працював чудово. Алгоритм обчислює, чи замінено патч новим патчем, і тому його не потрібно встановлювати. Однак до кінця список витіснених оновлень зростав дуже довгим *.

Алгоритм оновлення був експоненціальним, коли для кожного нового оновлення потрібно було обчислити вдвічі більше, ніж попереднє ( ). Коли списки потрапили в діапазон 40 оновлень (* довге ), на перевірку наявності оновлень знадобилося до 15 хвилин, працюючи на повну потужність. Це фактично заблокувало багато машин XP під час оновлення. Що ще гірше, коли потрібно було б встановити оновлення, алгоритм запустився б знову , зайнявши ще 15 хвилин. Оскільки для багатьох машин були встановлені автоматичні оновлення, це може зафіксувати машини на 15 хвилин при кожному завантаженні, а можливо, знову з певною періодичністю.O(n) = 2n

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

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


0

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

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


-1

Це сильно залежить від того, як ви визначаєте "хороші показники". Ваші алгоритми завжди повинні використовувати найкращу складність. Зловживайте лазівками, щоб пришвидшити середню клітку. Буфер і попереднє завантаження / попереднє компілювання в інтерактивній програмі.

Існує ще одне визначення поняття "хороші показники": Оптимізація констант вашого класу складності. Тут C ++ отримує свою назву, де люди починають називати Java повільно, де на 5% менше часу виконання здається святим граалом. Використовуючи це визначення, ви маєте рацію. Комп'ютерна техніка з часом ускладнюється, тоді як компілятори стають все краще і краще. У якийсь момент ви не можете реально оптимізувати низький кінець коду краще, ніж компілятор - тому просто нехай це буде і сконцентруйтесь на своїх алгоритмах.

У цей момент використання Java / Haskell / C ++ стає лише черговим дизайнерським рішенням. Подрібнення кількості можна здійснити через OpenCL на вашому графічному графіку. Користувацькі інтерфейси потребують постійних алгоритмів часу, і вони хороші. Вихід і модульність важливіші, ніж вирівнювання класів для 20% кращого використання кешу. Багатопоточність стає важливою, оскільки люди не хочуть швидкого додатка, вони хочуть чуйного. Неважливо, що ваш додаток постійно на 10% повільніше, ніж могло бути. Навіть 50% - це добре (але люди тоді починають задавати питання). Концентруйтесь на правильності, чуйності та модульності.

Я люблю програмування в Haskell або принаймні у функціональній формі (навіть на C ++). Вміння легко писати тести для всієї програми - це просто важливіший спосіб, ніж бути трохи швидшим у пакетній роботі.


-1

Досить просто: вартість

У мого попереднього роботодавця була система управління навчанням, яка розміщувалася на фізичних серверах як модель SaaS. Купа JVM була налаштована на 2 ГБ для старих машин і на 3 ГБ для новіших машин, і ми працювали по кілька примірників на машині. Ви могли б подумати, що цього буде достатньо.

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

Проблема в тому, що у нас було 2 Гб для роботи. Тож очевидним рішенням є почати кешування всіх часто читаних даних. Тоді у нас були проблеми з пам’яттю, починаючи прямо до того, як я прийшов на борт.

З цього приводу було дві школи думки:

  1. Пам'ять і апаратне забезпечення взагалі дешеві в ці дні. Просто придбайте більше оперативної пам’яті, щоб ви могли більше кешувати.
  2. Чому для системи управління навчанням потрібно 3+ ГБ оперативної пам’яті? Все, що він робить, видає запити SQL, надсилає переадресації для запуску курсів і оцінює хід студентів за допомогою курсів.

Другий аргумент виграв, і я витратив понад рік, налаштовуючи нашу пам'ять.

Мій нинішній роботодавець також розміщує систему управління навчанням, але розміщує її дещо інакше. Масштабованість настільки погана, що однією установкою (розділеною на 4 завантажені збалансовані віртуальні сервери) може працювати лише 80 клієнтів. Деякі з наших великих клієнтів навіть отримують власний набір серверів. Більшість проблем, що призводять до цього, - це проблеми з продуктивністю, як-от запити SQL, які зависають усі цикли процесора, витоки пам’яті, надмірний код, який робить те ж саме багато разів. У нас навіть створено внутрішнє додаток, єдиною метою якого є перезапуск серверів, коли вони не працюють погано. Є працівник, який підтримує цей інструмент (разом з іншими обов'язками).

Вони підписалися на першу школу думок, про яку я згадував вище: кидайте на неї більше обладнання, оскільки витрати на обладнання дешевші, ніж зарплата розробника.

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

Коли я приєднався, я відповідав за вирішення наших проблем із доступністю. Оскільки більшість наших проблем із доступністю були пов’язані з низькою продуктивністю, я налагодив продуктивність нашого коду, і масштабованість значно покращилася, із значно кращим режимом роботи. Ми готові почати збільшувати щільність. Потрібно сказати, що моя зарплата ніде не перевищує мільйона (я б хотів!), Тож витрачаючи гроші на налаштування мене на виконання коду, в кінцевому підсумку ми заощаджуємо мільйони на рік.

TL; DR

Якщо ви зробите ретельний аналіз витрат / вигод, ви побачите, що дешевше просто виправити код. Відома проблема ефективності, яку ви ігноруєте, перетворюється на технічну заборгованість .


1
Не кожен аналіз витрат / вигод призведе до "виправлення коду". Програмісти коштують дуже дорого, і якщо ви можете додати оперативну пам’ять менше, ніж вартість програміста, і все-таки виправити проблему ...
Роберт Харві

Приємно, що, перебравшись у хмарні ситуації, ви зможете побачити, скільки ви насправді платите за владу. Наприклад, ми використовуємо Amazon RDS для бази даних. Різниця між найбільшим та другим за величиною екземпляром становить приблизно. $ 3500 на рік. Це число, яке ви можете подивитися і оцінити, чи варто чимало програмного часу для оптимізації.
Carson63000

@RobertHarvey Щоправда, я не мав би цього робити абсолютно. Те, що я хотів сказати, було абсолютне "апаратне забезпечення дешевше, ніж час розробки", це не зовсім правда, але ти маєш рацію, іноді це може бути правдою.
Брендон

-2

Я зрозумів ваше запитання так: щоб досягти достатньо хороших показників (тобто користувачі раді, а мій бекенд не мріє), чи потрібно мені розуміти теорію алгоритмічної складності?

Це залежить від того, що ви маєте на увазі під "типовим" бізнес-додатком. У багатьох випадках, особливо прості інформаційні системи, схожі на CRUD, відповідь була б «ні». Для цього вам "просто" (іноді це насправді важко) потрібно вміти простежувати вузькі місця: чи пропустив я індекс у своїй базі даних? Чи надсилаю занадто багато даних по мережі? Чи є у мене передній стіл angular.js на тисячі доларів? Йдеться про створення звукової архітектури, добре знаючи, що ваша технологія зберігається, і уникати чуття. Ви можете домогтися цього, якщо ви хороший майстер, не обов'язково комп'ютер. Ще один спосіб сказати, що хлопці, які побудували оптимізатор запитів Oracle, мали справу з алгоритмічними складностями, просто потрібно правильно використовувати те, що вони вам надали.

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

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


-2

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.