Коли я повинен дбати про продуктивність?


16

Найдовше в таких місцях, як IRC-канал Java , SO та інших місцях, мені було сказано щось у рубриці "Турбуйтеся про те, як виглядає код та його читабельність / зрозумілість зараз, а також продуктивність пізніше, якщо це абсолютно необхідно". Тож довгий час я насправді не займався OCD щодо продуктивності свого маленького робочого столу чи веб-додатків, просто видаляючи, очевидно, неефективні.

Більшість відповідей - «А як щодо масштабованості?». Це правомірний момент, але якщо моє додаток було побудовано лише для розбору, скажімо, файлів довжиною 10 000 рядків, чи варто я зробити свій код безладним для невеликого відсотка людей, які збираються занести у файл 1000 000 рядків?

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

Відповіді:


23

Турбуйтеся про продуктивність, коли це стане проблемою.

Якщо ви пишете невелику програму для обробки 10 000 файлів рядків, і ви отримуєте 1 000 000 рядкового файлу кожен 100-й файл, це, мабуть, не має значення, що обробляти цей файл потрібно більше часу. Однак якщо ви регулярно отримуєте файли, які в 5-10 разів більше, ніж спочатку, і ваша програма займає занадто багато часу, щоб виконати свою роботу, тоді ви почнете профілювати та оптимізувати.

Тепер я сказав "занадто довго, щоб виконувати свою роботу". Це вирішує користувач або організація-спонсор. Якщо я виконую завдання, і мені потрібно 5 хвилин, щоб зробити щось, коли мені знадобилося 3 без програмного забезпечення або з іншим інструментом, я б, мабуть, подав звіт про помилку або запит на обслуговування, щоб покращити це.

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



Я починаю профілювати та оптимізувати. Якщо 1) робота займає тривалий час 2) один із апаратних ресурсів максимум (наприклад, 100% процесор)
А. Binzxxxxxx

10

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

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

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


5
++ ЛАЖНА ДИХОТОМІЯ! Вони ніколи не навчаться? Коли ви знайдете та виправите проблему з продуктивністю, код не тільки швидше, але й краще . Я тільки шкодую, що в мене є лише одна пропозиція!
Майк Данлаве

+1 за те, що написано, що НАЗВИЧНО хибна дихотомія ... не завжди, але зазвичай.
Дан Розенстарк

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

5

Істину, яку я зрозумів, вивчаючи мікропроцесори в коледжі, які залишилися зі мною:

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

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


1

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

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

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

Отже, коротка відповідь на ваше запитання - "не будьте марними. Пишіть для повторного використання. Це нормально бути лінивим при прототипуванні / розробці доказів концепцій, але не використовуйте цей прототип для виробничого коду."

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


0

Я намагаюся зробити код читабельним - продуктивність буде проклята.

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


0

Гм - ніколи?

Серйозно, код завжди повинен бути написаний таким чином, щоб його було легко зрозуміти та підтримувати.

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

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


3
Я не згоден з цим. Вимога щодо продуктивності - дійсна нефункціональна вимога до системи.
Томас Оуенс

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

Ага. Так, ваш абсолютно прав у такому випадку. Ви не турбуєтесь про можливості, тому що їх так багато, але зосередьтесь на тому, що знаєте.
Томас Оуенс

0

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

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

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


0

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

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

Команда з розробки ігор протягом 8 місяців випускає з двигуном, який працює лише на 2 кадри в секунду на їхньому найлюбшішому обладнанні з 32 ядрами, в той час як має тенденцію затримуватися протягом 15 секунд кожного разу, коли екран зайнятий, навряд чи миттєво отримає корисний продукт просто фіксація однієї маленької локалізованої точки доступу. Цілком ймовірно, що їх дизайн FUBAR таким чином, що гарантує епічний перегляд дошки для малювання та зміни дизайну, які можуть каскадувати в кожному куті бази коду.

З Джоном Кармаком він раз поговорив про те, як технологічна демонстрація повинна працювати як мінімум сотнями тисяч кадрів в секунду, щоб інтегрувати її у виробництво. Це не нездорова одержимість працездатністю. Він заздалегідь знає, що ігри потрібно запускати в цілому зі швидкістю 30 FPS, щоб клієнти вважали це прийнятним. Як результат, такий маленький аспект, як система м'якої тіні, не може працювати на 30 FPS, інакше гра в цілому не може бути достатньо швидкою, щоб забезпечити необхідний зворотний зв'язок у реальному часі. Це непридатно, поки не досягнуть необхідної ефективності. У таких критично важливих для ефективності сферах, де є основна вимога до ефективності, рішення, яке не може досягти достатньої швидкості, насправді не краще, ніж таке, яке взагалі не працює,. І ви не можете спроектувати ефективну систему м'яких тіней, яка працює з сотнями тисяч кадрів в секунду, як це потрібно для ігрового двигуна в реальному часі, якщо ви не заздалегідь поставите переважну кількість думок щодо її ефективності. Насправді в таких випадках 90 +% роботи орієнтоване на ефективність, оскільки тривіально розробити систему м'якої тіні, яка працює чудово за 2 години на кадр, використовуючи трасування тракту, але ви не можете розраховувати на її налаштування. працювати з сотнями кадрів в секунду без абсолютно різної зміни підходу.

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

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

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

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