Я можу бути упередженим, працюючи в дуже важливих для продуктивності сферах, таких як обробка зображень та ретрайсинг, але все одно я б сказав, щоб оптимізувати "якомога пізніше" . Незалежно від того, наскільки важливими є ваші вимоги, після вимірювання завжди є набагато більше інформації та ясності, коли ви вимірюєте, ніж заздалегідь, а це означає, що навіть найефективніші оптимізації зазвичай застосовуються пізніше після отримання таких знань.
Своєрідні випадки
Але іноді "якомога пізніше" все ще досить проклято рано в деяких своєрідних випадках. Якщо ми говоримо офлайн-рендерів, наприклад, структури даних та методи, якими ви користуєтесь для досягнення продуктивності, насправді проникають у дизайн користувача. Це може здатися огидним, але поле є настільки сучасним і настільки важливим для продуктивності, що користувачі приймають керування користувачами, специфічні для методів оптимізації, що застосовуються до певного променевого трекера (наприклад: керування опроміненням або фотонні карти), оскільки деякі з них використовуються чекати годин очікування зображення, а інші використовуються для того, щоб витратити величезні суми грошей на оренду або власність ферми візуалізації з машинами, призначеними для надання. Користувачі можуть скоротити час і гроші для тих користувачів, якщо конкурентний офлайн-рендер може запропонувати нетривіальне скорочення витраченого часу на надання. Це така сфера, де 5% скорочення часу насправді хвилює користувачів.
У таких своєрідних випадках ви не можете просто вибрати одну техніку візуалізації мимоволі і сподіватися її оптимізувати пізніше, оскільки вся конструкція, включаючи дизайн для кінця користувача, обертається навколо використовуваних вами структур даних та алгоритмів. Ви не обов'язково навіть просто працювати з тим, що добре спрацювало для інших людей, оскільки тут, як людина, і ваші особливі сильні та слабкі сторони сильно вказуєте на досягнення конкурентного рішення. Мислення та чутливість головного розробника, що стоїть за Арнольдом, відрізняються від тих, хто працює над VRay, який використовував зовсім інший підхід; вони не можуть обов'язково міняти місцями / технікою і робити найкращу роботу (хоча вони обоє лідери промисловості). Ви повинні створити експеримент, прототип та орієнтир і знайти те, що вам потрібно Ви особливо добре робите з огляду на нескінченний масив передових технологій там, якщо ви сподіваєтесь поставити щось конкурентоспроможне, що насправді продасть. Тож у цьому своєрідному випадку продуктивність стосується руху на передній план, як, мабуть, найважливіша проблема навіть перед початком розвитку.
І все-таки це не обов'язково порушення оптимізації "як можна пізніше" , це "якомога пізніше" - досить рано в цих крайніх і своєрідних випадках. Визначення того, коли і що не потребує таких ранніх проблем щодо ефективності, якщо взагалі колись, є, мабуть, основною проблемою для розробника. Що не оптимізувати, може бути однією з найцінніших речей, яку слід навчитися та продовжувати навчатись у кар’єрі розробника, оскільки ви не можете знайти дефіцит наївних розробників, які хочуть оптимізувати все (і, на жаль, навіть деяких ветеранів, яким вдалося якось зберегти свою роботу незважаючи на їх контрпродуктивність).
Як можна пізніше
Мабуть, найскладніша частина - спробувати зрозуміти, що це означає. Я все ще вчусь і займаюся програмуванням майже три десятиліття. Але особливо зараз, в моєму третьому десятилітті, я починаю розуміти, що це не так складно. Це не ракетна наука, якщо більше орієнтуватися на дизайн, ніж на реалізацію. Чим більше ваш дизайн залишає місця для дихання для відповідної оптимізації пізніше без змін у дизайні, тим пізніше ви можете оптимізувати. І дедалі більше продуктивності я отримую, шукаючи такі дизайни, які дозволяють мені зробити цю дихальну кімнату.
Дизайн, які пропонують дихальну кімнату оптимізувати пізніше
Такі типи конструкцій насправді не так важко досягти в більшості випадків, якщо ми можемо застосувати якийсь «здоровий глузд». Як особиста історія, я захоплююсь візуальними мистецтвами як хобі (я вважаю, що це дещо допомагає програмувати програмне забезпечення для художників, які я десь один, щоб зрозуміти їхні потреби та розмовляти їхньою мовою), і я провів деякий час на початку 2000-х, використовуючи аплети Oekaki в Інтернеті - швидкий спосіб малювати та ділитися своєю роботою та спілкуватися з іншими виконавцями.
Зокрема, на моєму улюбленому сайті та аплеті було багато недоліків (будь-який нетривіальний розмір пензля сповільнився б до повзання), але він мав дуже приємне співтовариство. Щоб вирішити проблеми з продуктивністю, я використовував маленькі кисті з 1 або 2 пікселями і просто накреслив свою роботу так:
Тим часом я продовжував давати автору пропозиції програмного забезпечення щодо підвищення продуктивності, і він помітив, що мої пропозиції мають особливо технічний характер, говорячи про оптимізацію пам'яті та алгоритми тощо. Тож він насправді запитав, чи я програміст, і я сказав так, і він запросив мене на роботу над вихідним кодом.
Тож я подивився на вихідний код, запустив його, профілював його, і на моє жах, він розробив програмне забезпечення навколо концепції "абстрактного інтерфейсу пікселів", який, як IPixel
виявився, є першопричиною за верхніми точками доступу до всього, що має динамічний характер виділення та відправлення для кожного пікселя кожного окремого зображення. Проте не було практичного способу оптимізувати це, не переглядаючи дизайн всього програмного забезпечення, тому що дизайн потрапив у куточок, де не дуже далеко, ніж найтривітніші мікрооптимізації, коли наші абстракції працюють на детальному рівні одного абстрактного пікселя і все залежить від цього абстрактного пікселя.
Я думаю, що це порушення "здорового глузду", але, очевидно, це було не таким здоровим глуздом для розробника. Але все одно, що не абстрагувати речі на такому детальному рівні, коли мільйони, навіть пікселі чи частинки, або крихітні одиниці в симуляції великої армії, будуть відомі навіть самі основні випадки використання. Вподобайте IImage
(ви можете обробляти всі формати зображень / пікселів, які вам потрібні на цьому об'ємному рівні сукупності) або IParticleSystem
до IPixel
або IParticle
, і тоді ви можете вводити найпростіші та швидкі для запису та прості для розуміння реалізації такі інтерфейси та мати всю дихальну кімнату, яку вам коли-небудь знадобиться оптимізувати пізніше, не переглядаючи дизайн всього програмного забезпечення.
І це мета, яку я бачу в наші дні. Виключаючи такі особливі випадки, як офлайн-рендері, описані вище, спроектуйте достатньо місця для дихання, щоб оптимізувати якомога пізніше з якомога більше інформації заднього огляду (включаючи вимірювання) та застосувати будь-які необхідні оптимізації якомога пізніше.
Звичайно, я не обов'язково пропоную використовувати алгоритми квадратичної складності на входах, які легко досягають нетривіального розміру в звичайних випадках для користувачів. Хто це робить? Але я навіть не думаю, що це така велика справа, якщо впровадження легко замінити пізніше. Це все ще не є серйозною помилкою, якщо вам не доведеться переглянути будь-які проекти.