Перейти до вмісту
ATAI Today Brief
ГоловнаНовиниКонцептиГайдиІнструменти
Про насПідписатисяEN
Підписатися

AI Today Brief

Щоденний бриф з AI-інженерії. Built in public. EN · UA.

XTelegramLinkedInYouTubeRSS
НовиниКонцептиГайдиПідписатисяРекламаПро насРедакційна політикаAI-розкриттяПриватністьУмови

© 2026 AI Today Brief. Усі права захищені.

  1. Головна/
  2. Новини/
  3. Оптимізація токенів/
  4. Як оптимізатор компілятора згенерував 256 КБ коду для ініціалізації 64 КБ даних
Оптимізація токенів

Як оптимізатор компілятора згенерував 256 КБ коду для ініціалізації 64 КБ даних

16 червня 2026 р.· 5 хв читання
OKКуратор Oleksandr Kuzmenko, AI Product Engineer·Оновлено 16 червня 2026 р.·Джерела вказані в кожному матеріалі
За участі AI · перевірено редактором·Як ми використовуємо AI
Як оптимізатор компілятора згенерував 256 КБ коду для ініціалізації 64 КБ даних

Команда розробників емулятора Windows x86-32 виявила програму, яка ініціалізувала стек-буфер розміром 64 КБ. Замість звичайного циклу компілятор розгорнув його в 65 536 окремих 4-байтних інструкцій запису, що змусило команду додати кастомну оптимізацію в транслятор.

Вплив: Низький

Чому це важливо

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

TL;DR

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

Ключові факти

Розмір виділення на стеку64 КБ
Розмір інструкції4 байти
Загальний обсяг коду256 КБ
Розмір виділення на стеку
64 КБ
Згенеровано інструкцій
65 536
Розмір інструкції
4 байти
Загальний обсяг коду
256 КБ

Ретро-провал компіляції

Під час розробки емулятора процесора x86-32 для Windows інженери покладалися на бінарну трансляцію для перетворення інструкцій x86 на рідні інструкції цільового процесора. Цей емулятор функціонував подібно до сучасного JIT-компілятора. Проте його ефективність піддалася серйозному випробуванню через дивну поведінку компілятора в одній із програм.

Програма мала виділити 64 КБ пам'яті на стеку та ініціалізувати її. Стандартна процедура є простою: 1. Виконати перевірку стеку (stack probe) для верифікації доступності пам'яті. 2. Відняти 65536 від вказівника стеку. 3. Ініціалізувати пам'ять за допомогою короткого, щільного циклу.

Невдале розгортання циклу

Замість генерації циклу компілятор вирішив оптимізувати код шляхом його повного розгортання. Він створив 65 536 окремих інструкцій "запис байта в пам'ять". Кожна інструкція мала довжину 4 байти, що означало потребу у 256 КБ бінарного коду лише для ініціалізації 64 КБ стеку.

Патч для емулятора

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

Спробуй за 2 хвилини

// Conceptual representation of the target function before and after compiler unrolling
char stack_buf[65536];
for (int i = 0; i < 65536; i++) {
    stack_buf[i] = 0;
}

c

✓ Коли використовувати

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

✕ Коли НЕ варто

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

Що зробити сьогодні

  • →Перевірте обмеження оптимізації розгортання циклів у прапорцях вашого компілятора (наприклад, -funroll-loops порівняно з -O2/-O3).
  • →Проведіть аудит розміру бінарних файлів для критично важливих компонентів для виявлення неочікуваного роздуття коду.

Що каже спільнота

  • “Does that make you the first in a long tradition of GPU developers going to blockbuster app devs to say "hey, you should be doing this instead?"”

    — nxobject на Hacker News

  • “I get what you're saying, but asking for 1 byte 65536 times, is indeed different than asking for 65536 bytes, 1 time.”

    — b112 на Hacker News

#Windows

Джерела

  • The Old New Thing Blog
ПоділитисяПоділитися в XПоділитися в LinkedIn

Схожі матеріали

  • Оптимізація токенівОптимізація витрат на LLM за допомогою RouteLLM та динамічного роутингу запитів
  • Оптимізація токенівЧому «відсоток коду, написаного ШІ» є марнославною метрикою

Email-дайджест

Отримуйте ранковий AI-бриф

Один лист на день — історії, що важливі для інженерів, фаундерів і техлідів. Редагує людина, з посиланнями на першоджерела.

  • ✓120+ джерел щодня
  • ✓Редагує людина
  • ✓1 лист на день
  • ✓EN + UA

Підписуючись, ви погоджуєтесь з політикою конфіденційності.