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

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

Ось 12 способів оптимізувати код, щоб він був компактнішим, швидшим і дешевшим у використанні.

Пишіть швидший код

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

Зменште використання оперативної пам’яті

Обсяг використовуваної оперативної пам’яті — важливий параметр для ціноутворення хмарних екземплярів. У багатьох випадках подвоєння обсягу оперативної пам’яті також подвоює вартість. Програмісти можуть зменшити використання оперативної пам’яті, уникаючи зберігання даних у пам’яті. Деякі потокові алгоритми, як-от класи Stream у Java, призначені для роботи з великими файлами даних, не завантажуючи їх усі в пам’ять. Проєкт Apache DataSketches генерує приблизні відповіді для складної статистики великих даних, не займаючи при цьому всю пам’ять.

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

Використовуйте зображення та відео з нижчою роздільною здатністю

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

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

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

Видаляйте непотрібні дані

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

Обмежте використання дискового простору

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

Очищайте журнали

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

Перейдіть на безсерверну архітектуру

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

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

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

Архівуйте старі дані

Що старіші дані, то рідше до них звертаються. Ви можете врахувати це й налаштувати застосунок так, щоб він переносив старі дані в дешевше місце. Деякі хмарні сервіси беруть набагато менше за так зване «холодне сховище», коли доставлення бітів може тривати хвилини або навіть години. Інші хмарні сервіси, як-от Wasabi чи Backblaze, спеціалізуються на архівному зберіганні об’єктів Amazon S3 і беруть значно менше, ніж основні хмарні сервіси. У деяких випадках вони навіть не стягують плату за виведення даних. Вивантаження даних, щойно вони перестають бути дуже затребуваними, може бути надзвичайно вигідним.

Спростіть макети CSS

Якщо ви бачили HTML-теги, згенеровані деякими фреймворками, то знаєте, наскільки безглуздими можуть бути макети. Це просто DIV-теги, вкладені один в один, і їх створення та передавання коштує грошей. Один вебдизайнер, якого я знаю, хвалиться, що скоротив рахунки за пропускну здатність на 30%, просто створивши простіший макет із розумнішим використанням CSS.

Створюйте статичні сайти

Деяким фреймворкам, як-от React, потрібно чимало обчислювальної потужності, особливо якщо вони використовують такі функції, як рендеринг на стороні сервера. Увесь цей код збільшує щомісячний рахунок за хмарні сервіси. Протилежна філософія — створювати статичний сайт із незмінних фрагментів HTML, CSS і jаvascript, які дослівно віддаються з кешу. Використання мережі доставки контенту може ще більше пришвидшити доставлення, перемістивши кеші ближче до користувача.

Різні фреймворки підтримують цю статичну філософію. Jekyll, Hugo, Gridsome і Pelican — лише кілька інструментів, які зберуть увесь ваш контент у набір компактних незмінних файлів. Ви все ще можете додавати персоналізацію на сторінки за допомогою викликів AJAX, але більша частина сайту створюватиме незначне навантаження на сервери.

Винесіть обчислення та зберігання назовні

Оскільки браузери стають дедалі потужнішими, деякі фреймворки спрощують перенесення більшої частини обчислень безпосередньо на клієнт. Якісний код jаvascript або WebAssembly може перекласти більшу частину навантаження на комп’ютер користувача, а не на ваші хмарні сервери. Деякі розробники зводять свій хмарний рівень до простої бази даних із невеликою кількістю бізнес-логіки для автентифікації. Один мій друг запускає все зі статичного HTML і серверного PostgreSQL із вбудованими процедурами, що виводять JSON.

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

Призначте інженера з витрат

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