Що робить великий і складний програмний продукт повільним? [зачинено]


16

З причини, яка в значній мірі не має значення, я встановив Delphi 7 ще раз за такий довгий час. Треба сказати, що мене повністю здуло - таким чином я не був досить довго. Це зовсім не так, як я пам’ятаю речі. Установка зайняла близько 30 секунд. Його запуск зайняв 2 секунди, і він був одразу використаний. Я можу натиснути "Виконати" другу після її запуску, і менше ніж через секунду порожня програма вже видно і працює. Ура для комп’ютерів стає набагато швидше!

Але причина, яку я здула так, полягає в тому, що зазвичай я використовую Visual Studio 2010, це зовсім не відчуває себе так швидко. Звичайно, Delphi 7 є набагато менше , ніж система Visual Studio 2010, але у нього є зовнішній вигляд того , щоб все дійсно необхідні речі там: палітра управління, конструктор форм, редактор коду з кодом завершення. Я усвідомлюю, що мова може бути простішою, і завершення коду може бути набагато менш потужним, і IDE може бути не настільки розширеним і насиченим функціями, але все-таки: я не розумію, як (тобто через який механізм) це має безліч додаткових функцій (які я, можливо, ще навіть не спрацьовував), спричиняють такі системи, як Visual Studio, завжди мляві в порівнянні.

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


7
Просте: у міру збільшення маси потрібно більше сил для подолання інерції.
Shog9

Хтось колись сказав мені менеджерам, але я взагалі не вірю в це.
MIchael Grassman

1
Це велика частина причини, по якій я все ще в основному використовую D7 для програмування Delphi.
GrandmasterB

Найшвидший код - це той, який ніколи не виконується.
Генрі

4
@romkyns: Я вважаю, що багато програмного забезпечення в сучасну епоху часто неймовірно роздуті, зайво великі та громіздкі. Зараз багато програмного забезпечення вирішує ті самі питання, які були вирішені десять, навіть двадцять років тому, з часткою потужності та простору. Чому він досі відстає так само погано, як колись, якщо не більше? Неефективність і здуття.
Увімкнення

Відповіді:


20

Архітектурна космонавтика

Visual Studio 2010 створений на основі презентації Windows. Погляньте на клавішу Button для WPF. Це 9-та дитина базового класу. Він містить близько 5 сторінок властивостей, методів та подій. За лаштунками є ще п’ять сторінок визначень стилів, які описують його красиво закруглені кути та тонкі анімаційні переходи, коли курсор миші переміщається по ньому. Це все для чогось, що принципово відображає деякий текст чи малюнок і створює подію клацання, коли він виявляє кнопку миші, що йде вниз.

Зупиніть програму на зразок Visual Studio у будь-якій випадковій точці. Подивіться на слід стека. Дуже добре, що ти на 20 рівнів заглиблюєшся у стек викликів і що туди завантажено п’ять DLL-файлів.

А тепер порівняйте ці дві речі з Delphi. Б'юсь об заклад, ви виявите, що кнопка Delphi має всього 20 властивостей, методів та подій. Б'юсь об заклад, що у Delphi IDE є лише стек стека на глибину 5-7 рівнів. Тому що, коли комп’ютери були повільнішими, ви просто не могли взяти накладні витрати Visual Studio 2010, а IDE не зайняв 40 хвилин для запуску :-)

Чи один кращий за інший? Ну, як правило, я можу сказати програмі Delphi, коли вона завантажується, тому що вона виглядає рівною, кольори приглушені (можливо, 8 біт?), І немає тонкого затінення чи анімації. Я просто відчуваю себе "дешево" в ці дні. Дешево, але швидко.

Чи нам краще? Це питання до філософів, а не до кодерів.


4
Програма Delphi не виглядає рівною. Скоріше, програміст програмує програму, щоб вона виглядала рівномірно. Ви можете зробити приємні на вигляд сучасні, повнокольорові інтерфейси з Delphi так само, як ви могли в C # або C ++.
гросмейстерB

2
Це прониклива відповідь; але я не впевнений, що це закінчено. Visual Studio 2008 (попередник 2010 року) не має WPF у ньому, і все ж це світи повільніше, ніж Delphi 7. Ви б все-таки сказали те саме про глибину стека викликів та кількість завантажених DLL-файлів?
Тімві

3
@Timwi Так, абсолютно б я. Моя думка була менше про зло WPF (мені подобається WPF насправді) і більше про те, як ми схильні додавати шари на шари програмної абстракції, коли надаємо вибір. Можливо, у Visual Studio 2008 не було стільки накладних витрат, але, як ви зазначили, цього було цілком достатньо :-)
Джей Бівер

@GrandmasterB, я не грюкую Delphi, оскільки він має меншу кількість припущень і більш прості бібліотеки. WPF був розроблений, передбачаючи, що апаратне прискорення графічного процесора дозволить програмам використовувати глибші кольори, часті анімації, альфа-змішування, тіні тощо. Delphi був розроблений у той час, коли ці припущення неможливо було зробити. Не могли б ви реалізувати все це в Delphi? Звичайно, але вам доведеться ввести багато кодування, щоб отримати поведінку кнопки WPF. З іншого боку, кнопка Delphi не поставляється із вимогами до процесора, пам'яті та графічного процесора, або кнопкою WPF є питання, яке було питанням @ OP.
Джей Бівер

10
Ваш аргумент щодо плоского та простого інтерфейсу повністю недійсний завдяки новому інтерфейсу Windows 10 «Сучасний». Тепер у нас є все, що над головою, щоб створити плоскі, квадратні, звичайні кнопки, як у нас 30 років тому.
gbjbaanb

11

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

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

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

Вільна координація та спадщина

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

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

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

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

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

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

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

Ефективність пам'яті

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

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

Рішення

Для мене рішення - шукати більш скоординовані, менші команди для створення продуктів, які зможуть відслідковувати свої "витрати" і уникати "купівлі" одних і тих же предметів знову і знову.

Вартість

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

Але я бачу багато вихідного коду для програм, які справляються з великим навантаженням (наприклад, спілкування з сотнями тисяч до мільйонів Pixelабо Booleanекземплярів), оплачуючи ці витрати на такому детальному рівні.

Об'єктно-орієнтоване програмування це може дещо посилити. Але це не винні "об'єкти" самі по собі або навіть OOP з вини, це просто те, що такі витрати оплачуються на такому детальному рівні підліткового елемента, який збирається придумати мільйонами.

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

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

Передчасна оптимізація

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

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

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

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


2
Технічна заборгованість, іншими словами. Технічний борг, який ніколи не виплачується.
Роберт Харві

1
Роберт прав. Одна помилка з боку хлопця, двісті помилок --forced з боку керівників кричать "ви звільнені, якщо ви цього не зробите до завтра", які відвернуть роки передового досвіду інженерії програмного забезпечення, TDD, тестування блоків і будь-якого принципу людського і розумного програмування , плюс два рази вам набридло .. той хлопець, який покинув компанію з розуму, тому що його звільнили без причини і заплутав кодову базу .. ті вимкнуті бібліотеки, які ви ніколи не оновлювали ... і ось у вас це: смачна база коди спагетті і роздуте програмне забезпечення. Приємного апетиту
користувач3834459

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

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

1
У погані старі часи я реалізував якийсь код, щоб обійти графічні API та безпосередньо отримати пікселі в пам'яті для критичного фрагмента мого коду. Різниця між багатьма шарами абстракції та прямим доступом була чимось на кшталт 100x, що мало значення на комп’ютері в ті часи. Тепер ви, комп’ютери, досить швидкі, що ви можете оскаржувати будь-яку кількість абстракцій, якщо потрібно.
Майкл Шопсін
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.