Optymalizacja wydajności z Codex
ENOptymalizacja wydajności z Codex to pętla w czterech etapach: diagnoza w trybie tylko do odczytu, która wskazuje wąskie gardło, harness benchmarku zapisany w commicie przed jakąkolwiek poprawką, zadania chmurowe best-of-N (codex cloud exec --attempts, maksymalnie cztery próby) sprawdzające konkurencyjne strategie oraz deterministyczna bramka, która przyjmuje zmianę tylko wtedy, gdy przechodzą własny benchmark i testy zespołu.
Ten przewodnik jest dla programistów odpowiedzialnych za wolny serwis i dla tech leadów, którzy decydują, kiedy zmianę wydajnościową można zmergować. P95 twojego API przekroczyło dwie sekundy, dashboard świeci na czerwono, a wolne żądanie przechodzi przez trzy serwisy, bazę danych i cache. Baza na twoim laptopie ma jedną tysięczną wierszy produkcji, więc lokalny profil wskazuje zły kod. Polecenia na tej stronie sprawdzono na Codex CLI 0.157.1 w dniu 2026-09-26.
Co zyskasz dzięki tej pętli
Dział zatytułowany „Co zyskasz dzięki tej pętli”- Prompt diagnostyczny w trybie tylko do odczytu, który zwraca uszeregowane wąskie gardła ze ścieżkami plików i dowodami, a niczego nie zmienia.
- Harness benchmarku i baseline zapisany w repozytorium, których Codex nie może edytować, więc deklarowane przyspieszenie jest zmierzone.
- Zadanie chmurowe best-of-N, które sprawdza do czterech strategii optymalizacji, oraz polecenia do porównania prób i zastosowania jednej z nich.
- Sekwencję weryfikacji, która dowodzi poprawności zmiany bez czytania każdej linii diffu.
- Cotygodniowe wykrywanie regresji, w którym o wyniku decyduje skrypt, a Codex tylko wyjaśnia porażkę.
Etap wcześniejszy to codzienna eksploatacja Codex. Warunek wstępny: środowisko chmurowe Codex, którego skrypt setup potrafi wypełnić bazę danymi testowymi; zobacz środowiska chmurowe Codex. Tę samą pętlę dla innych agentów opisują analiza wydajności z Claude Code i optymalizacja wydajności z Cursorem.
Dlaczego praca nad wydajnością z Codex zaczyna się od benchmarku, a nie od poprawki?
Dział zatytułowany „Dlaczego praca nad wydajnością z Codex zaczyna się od benchmarku, a nie od poprawki?”Agent poproszony o „przyspieszenie” podaje liczbę, która pochodzi z przebiegu, którego nie widziałeś, na danych, których nie wybrałeś. Zmiany wydajnościowe psują się też po cichu: cache serwujący nieaktualne dane albo indeks blokujący tabelę na produkcji przechodzą testy jednostkowe. Dlatego kolejność jest stała:
- Diagnozuj w sandboksie tylko do odczytu, żeby nic się nie zmieniło, gdy patrzysz.
- Zacommituj benchmark i baseline, zanim powstanie jakakolwiek optymalizacja.
- Pozwól Codex sprawdzać strategie na tym benchmarku w izolowanych kontenerach chmurowych.
- Uruchom benchmark ponownie sam, poza agentem, i merguj tylko na podstawie tego wyniku.
Każdy krok poniżej daje artefakt, który sprawdzasz w następnym kroku: raport, harness, zestaw diffów oraz wynik „przechodzi” albo „nie przechodzi”.
Zdiagnozuj wąskie gardło bez zmieniania kodu
Dział zatytułowany „Zdiagnozuj wąskie gardło bez zmieniania kodu”Zacznij diagnozę w sandboksie tylko do odczytu: Codex czyta kod i uruchamia polecenia tylko do odczytu, ale nie edytuje plików. Diagnoza wymaga głębszego rozumowania, a GPT-6.1 Sol (domyślny model Codex) działa z wysiłkiem low, dopóki go nie podniesiesz. Uruchom w terminalu, w katalogu głównym repozytorium:
codex --sandbox read-only -c model_reasoning_effort="high"Jeśli masz już skonfigurowany dla Codex serwer MCP bazy danych w trybie tylko do odczytu (widać go w codex mcp list), Codex może uruchomić EXPLAIN na prawdziwych planach zapytań zamiast je zgadywać. Jakich serwerów użyć i jak utrzymać je w trybie tylko do odczytu, opisuje optymalizacja wydajności na produkcji.
Ostatnia linia jest ważniejsza, niż wygląda. Diagnoza, która miesza zmierzone plany z domysłami, każe ci optymalizować domysł. Każde wąskie gardło oznaczone jako „inferred” traktuj jako hipotezę do potwierdzenia benchmarkiem.
Zbuduj harness benchmarku, którego Codex nie obejdzie
Dział zatytułowany „Zbuduj harness benchmarku, którego Codex nie obejdzie”Harness jest wyrocznią dla wszystkiego, co dalej, więc trafia do osobnego commita przed jakąkolwiek optymalizacją. Dwie zasady czynią go wiarygodnym:
- Dane w skali produkcyjnej. Wygeneruj co najmniej 100 000 wierszy w tabelach wskazanych przez diagnozę, z realistycznym rozkładem (kilku ciężkich użytkowników, wielu lekkich). Wzorce N+1 i brakujące indeksy są niewidoczne przy tysiącu wierszy.
- Powtarzalne wyniki. Żądania rozgrzewające, kilka przebiegów i mediana p95 z każdego z nich. Pojedynczy przebieg na obciążonej maszynie mierzy maszynę.
Ten diff przejrzyj sam; to jedyny diff w pętli, który warto przeczytać linia po linii, bo każda późniejsza decyzja na nim polega. Potem zapisz go w osobnym commicie. Od tej chwili każdy diff optymalizacyjny, który dotyka perf/ albo scripts/seed-perf.ts, odrzucasz bez dyskusji.
Uruchom konkurencyjne optymalizacje jako zadania chmurowe best-of-N
Dział zatytułowany „Uruchom konkurencyjne optymalizacje jako zadania chmurowe best-of-N”codex cloud exec --attempts N uruchamia N niezależnych agentów na tym samym prompcie; każdy daje własny diff. CLI przyjmuje wartości od 1 do 4 i odrzuca każdą inną (sprawdzone na 0.157.1), a całe codex cloud jest oznaczone jako eksperymentalne. Każda próba to osobny przebieg agenta, który zużywa 5-godzinny i tygodniowy limit twojego planu, więc N prób zużywa mniej więcej N razy tyle limitu co jedna; zobacz zarządzanie kosztami Codex.
Best-of-N opłaca się w pracy nad wydajnością, bo strategie mają różne kompromisy: przepisane zapytanie zmienia jeden plik, cache dodaje infrastrukturę i problem unieważniania, a równoległe pobieranie zmienia obsługę błędów. Próby z tym samym promptem mają tendencję do zbiegania się, więc nazwij alternatywy i wymagaj, żeby każda próba podała swój wybór.
Zanim wyślesz zadanie, środowisko chmurowe musi umieć uruchomić harness: jego skrypt setup instaluje zależności, uruchamia bazę i wykonuje scripts/seed-perf.ts. Skrypty setup, cache i dostęp agenta do internetu opisuje strona środowiska chmurowe Codex. Najpierw wypchnij commit z harnessem, bo kontener klonuje twoją gałąź ze zdalnego repozytorium.
Wyślij je z terminala, w repozytorium, z promptem zapisanym w pliku:
git push origin perf/dashboardcodex cloud exec --env perf-test --branch perf/dashboard --attempts 3 - < prompts/dashboard-perf.mdperf-test to etykieta albo ID twojego środowiska chmurowego, a - czyta prompt ze standardowego wejścia. Polecenie wypisuje URL zadania; jego ID to TASK_ID w poleceniach poniżej.
Wybierz próbę na podstawie dowodów, a nie najlepszej liczby
Dział zatytułowany „Wybierz próbę na podstawie dowodów, a nie najlepszej liczby”Zanim otworzysz jakikolwiek diff, porównaj próby na podstawie metadanych i liczb:
# Status, liczba prób i rozmiar każdego zadania w tym środowiskucodex cloud list --env perf-test --json \ | jq '.tasks[] | {id, status, attempt_total, summary}'
# Zapisz diff każdej próby do porównaniafor n in 1 2 3; do codex cloud diff TASK_ID --attempt "$n" > "attempt-$n.diff"; doneKontener to nie twój sprzęt produkcyjny, więc porównuj wynik „przed” i „po” każdej próby w tym samym kontenerze, a nie bezwzględne milisekundy między próbami. Potem zestaw zysk z tym, co próba dokłada:
| Pytanie | Wybierz próbę, która… | Odrzuć, gdy… |
|---|---|---|
| Czy osiągnęła cel? | Schodzi poniżej 500 ms, z wynikiem „przed” i „po” z tego samego kontenera | Nie podaje wyniku „przed” albo ma tylko jeden przebieg |
| Jak duża jest zmiana? | Dotyka najmniejszej liczby plików przy danym zysku | Dotyka perf/, asercji testów albo snapshotów |
| Co dokłada do utrzymania? | Nie dodaje nowego serwisu | Dodaje cache bez testu świeżości danych |
| Czy migracja jest bezpieczna? | Buduje indeks bez blokowania | Buduje indeks, który blokuje gorącą tabelę |
Jeśli dwie próby wygrywają każda na innym wąskim gardle, zastosuj jedną, zaktualizuj baseline i uruchom drugie zadanie dla kolejnego wąskiego gardła. Ręcznie sklejone dwie próby to nowa, niezmierzona zmiana.
Zweryfikuj optymalizację bez czytania każdej linii
Dział zatytułowany „Zweryfikuj optymalizację bez czytania każdej linii”Liczby podane przez agenta mówią ci, którą próbę sprawdzić, a nie czy ją zmergować. Weryfikacja odbywa się poza agentem, a zatwierdza ją konkretna osoba.
-
Zastosuj próbę w czystym worktree. Uruchom w terminalu, z głównego checkoutu:
Okno terminala git fetch origin perf/dashboardgit worktree add --detach ../verify-perf origin/perf/dashboard && cd ../verify-perfcodex cloud apply TASK_ID --attempt 2git diff --stat -- perf/ scripts/seed-perf.ts # nie może nic wypisać -
Uruchom bramki samodzielnie. Uruchom sprawdzanie typów, linter i pełny zestaw testów, a potem seed i benchmark:
node perf/bench.mjskończy się kodem niezerowym, gdy mediana p95 przekracza baseline o więcej niż 10%. Liczy się ta liczba, a nie ta z podsumowania zadania. -
Sprawdź plan zapytania, nie kod. Jeśli zmiana dodaje indeks, uruchom
EXPLAINna nowym zapytaniu w bazie wypełnionej danymi testowymi (poscripts/seed-perf.ts) i potwierdź, że plan go używa. Indeks złożony z kolumnami w złej kolejności kompiluje się, przechodzi testy i nic nie daje. -
Otwórz pull request z dowodami. Wklej do opisu JSON „przed” i „po” oraz plan zapytania i poproś o
@codex reviewna pull requeście. Każdą migrację i zmianę cache skieruj do właściciela kodu serwisu; zobacz code review z Codex. -
Udowodnij zysk na produkcji i zachowaj drogę odwrotu. Wdrażaj za flagą funkcji albo na canary, porównaj p95 tego samego endpointu w danych tracingu aplikacji w tym samym oknie czasowym i wycofaj zmianę, jeśli nie ma poprawy. Osoba, która wysłała zadanie, odpowiada za merge i za decyzję o wycofaniu.
Gdy zmiana przejdzie, zaktualizuj perf/baseline.json w osobnym commicie, żeby kolejne sprawdzenie regresji mierzyło względem nowej liczby.
Wykrywaj regresje wydajności co tydzień
Dział zatytułowany „Wykrywaj regresje wydajności co tydzień”Cotygodniowe sprawdzenie utrzymuje zysk. O wyniku niech decyduje skrypt, a Codex niech tylko wyjaśnia porażkę, bo agent zapytany „czy wydajność spadła?” potrafi przekonać sam siebie do każdej odpowiedzi.
Zaplanuj node perf/bench.mjs w CI (na przykład cotygodniowy wyzwalacz schedule). Gdy skrypt kończy się kodem niezerowym, uruchom nieinteraktywny krok Codex (codex exec) w trybie tylko do odczytu, który zapisuje diagnozę do pliku:
status=0node perf/bench.mjs > perf/latest.json || status=$? # działa też pod bash -e na runnerach CIif [ "$status" -ne 0 ]; then codex exec --sandbox read-only --ephemeral -o perf/triage.md - < prompts/perf-triage.mdfiexit "$status"Pobierz pełną historię repozytorium (na przykład fetch-depth: 0 w actions/checkout), bo inaczej git log w kroku diagnozy widzi tylko jeden commit. Skrypt zachowuje kod wyjścia benchmarku, więc przy regresji zadanie CI pozostaje czerwone, a powiadomienia o nieudanym zaplanowanym przebiegu nadal działają; plik z diagnozą jest załącznikiem do tej porażki, a nie werdyktem. -o (--output-last-message) zapisuje ostatnią wiadomość do pliku, który zadanie CI może dołączyć do issue, a --ephemeral nie zapisuje sesji na dysku. Ustaw zadaniu CI timeout, bo codex exec nie ma limitu wydatków (sprawdzone na 0.157.1). Uwierzytelnianie, sekrety i plik workflow opisują strony CI/CD z Codex oraz uruchamianie Codex bez interakcji. Żeby uruchamiać to samo sprawdzenie z aplikacji desktopowej, zobacz automatyzacje Codex.
Diagnozę czyta człowiek i decyduje o następnym kroku: revert, nowe zadanie optymalizacyjne albo świadomie przyjęty kompromis i nowy baseline.
Co się psuje w pracy nad wydajnością z Codex?
Dział zatytułowany „Co się psuje w pracy nad wydajnością z Codex?”| Objaw | Przyczyna | Naprawa |
|---|---|---|
| Poprawka jest szybka lokalnie i wolna na produkcji | Dane benchmarku dużo mniejsze niż produkcyjne | Zasil bazę danymi w skali produkcyjnej w skrypcie setup środowiska chmurowego; zaktualizuj baseline przed kolejną próbą |
| Benchmark się poprawia, a użytkownicy nie widzą zmiany | Próba edytowała harness, seed albo test | Odrzucaj każdy diff dotykający perf/; trzymaj regułę „benchmark oracle” w AGENTS.md i sprawdzaj git diff --stat w kroku 1 weryfikacji |
| Wszystkie próby dają to samo podejście | Ten sam prompt bez nazwanych alternatyw | Nazwij strategie i wymagaj, żeby każda próba podała swój wybór |
| Wyniki skaczą między przebiegami | Obciążona maszyna, brak rozgrzewki, jeden przebieg | Pięć przebiegów, żądania rozgrzewające, mediana p95; porównuj „przed” i „po” w jednym kontenerze |
| Użytkownicy widzą nieaktualne dane po zmianie cache | TTL bez unieważniania przy zapisie | Wymagaj w prompcie testu świeżości; wyłącz flagę, potem dodaj unieważnianie |
| Wdrożenie blokuje tabelę | Indeks budowany blokującym poleceniem na gorącej tabeli | Buduj bez blokowania (CREATE INDEX CONCURRENTLY w PostgreSQL) w osobnej migracji; zobacz praca z bazą danych w Codex |
| Diagnoza nie wskazuje żadnych podejrzanych commitów | Płytki checkout w CI, więc git log widzi jeden commit | Pobierz pełną historię (fetch-depth: 0) w zaplanowanym zadaniu |
| Best-of-N wyczerpuje tygodniowy limit | Cztery próby dla mechanicznej zmiany | Używaj prób tylko tam, gdzie strategie się różnią; jedna próba dla znanej poprawki |
Dokąd dalej z wydajnością
Dział zatytułowany „Dokąd dalej z wydajnością”- Środowiska chmurowe Codex: skrypty setup, dostęp do sieci i best-of-N w szczegółach.
- Testy obciążeniowe, stresowe i benchmarki: zamień harness w test obciążeniowy i bramkę CI dla każdego serwisu.
- Optymalizacja wydajności na produkcji: diagnoza regresji p99, wyczerpania puli połączeń i autoskalowania z serwerami MCP tylko do odczytu.
- Praca z bazą danych w Codex: zapytania, indeksy i migracje, które agent pisze bezpiecznie.
- Zarządzanie kosztami Codex: ile best-of-N i zaplanowane przebiegi kosztują względem twojego limitu.
- Audyt bezpieczeństwa z Codex: następna strona na tym etapie.