Przejdź do głównej zawartości

Optymalizacja 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.

  • 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:

  1. Diagnozuj w sandboksie tylko do odczytu, żeby nic się nie zmieniło, gdy patrzysz.
  2. Zacommituj benchmark i baseline, zanim powstanie jakakolwiek optymalizacja.
  3. Pozwól Codex sprawdzać strategie na tym benchmarku w izolowanych kontenerach chmurowych.
  4. 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”.

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:

Okno terminala
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:

Okno terminala
git push origin perf/dashboard
codex cloud exec --env perf-test --branch perf/dashboard --attempts 3 - < prompts/dashboard-perf.md

perf-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:

Okno terminala
# Status, liczba prób i rozmiar każdego zadania w tym środowisku
codex cloud list --env perf-test --json \
| jq '.tasks[] | {id, status, attempt_total, summary}'
# Zapisz diff każdej próby do porównania
for n in 1 2 3; do codex cloud diff TASK_ID --attempt "$n" > "attempt-$n.diff"; done

Kontener 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:

PytanieWybierz próbę, która…Odrzuć, gdy…
Czy osiągnęła cel?Schodzi poniżej 500 ms, z wynikiem „przed” i „po” z tego samego konteneraNie podaje wyniku „przed” albo ma tylko jeden przebieg
Jak duża jest zmiana?Dotyka najmniejszej liczby plików przy danym zyskuDotyka perf/, asercji testów albo snapshotów
Co dokłada do utrzymania?Nie dodaje nowego serwisuDodaje cache bez testu świeżości danych
Czy migracja jest bezpieczna?Buduje indeks bez blokowaniaBuduje 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.

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.

  1. Zastosuj próbę w czystym worktree. Uruchom w terminalu, z głównego checkoutu:

    Okno terminala
    git fetch origin perf/dashboard
    git worktree add --detach ../verify-perf origin/perf/dashboard && cd ../verify-perf
    codex cloud apply TASK_ID --attempt 2
    git diff --stat -- perf/ scripts/seed-perf.ts # nie może nic wypisać
  2. Uruchom bramki samodzielnie. Uruchom sprawdzanie typów, linter i pełny zestaw testów, a potem seed i benchmark: node perf/bench.mjs kończy się kodem niezerowym, gdy mediana p95 przekracza baseline o więcej niż 10%. Liczy się ta liczba, a nie ta z podsumowania zadania.

  3. Sprawdź plan zapytania, nie kod. Jeśli zmiana dodaje indeks, uruchom EXPLAIN na nowym zapytaniu w bazie wypełnionej danymi testowymi (po scripts/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.

  4. Otwórz pull request z dowodami. Wklej do opisu JSON „przed” i „po” oraz plan zapytania i poproś o @codex review na pull requeście. Każdą migrację i zmianę cache skieruj do właściciela kodu serwisu; zobacz code review z Codex.

  5. 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.

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:

Okno terminala
status=0
node perf/bench.mjs > perf/latest.json || status=$? # działa też pod bash -e na runnerach CI
if [ "$status" -ne 0 ]; then
codex exec --sandbox read-only --ephemeral -o perf/triage.md - < prompts/perf-triage.md
fi
exit "$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.

ObjawPrzyczynaNaprawa
Poprawka jest szybka lokalnie i wolna na produkcjiDane benchmarku dużo mniejsze niż produkcyjneZasil bazę danymi w skali produkcyjnej w skrypcie setup środowiska chmurowego; zaktualizuj baseline przed kolejną próbą
Benchmark się poprawia, a użytkownicy nie widzą zmianyPróba edytowała harness, seed albo testOdrzucaj 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ścieTen sam prompt bez nazwanych alternatywNazwij strategie i wymagaj, żeby każda próba podała swój wybór
Wyniki skaczą między przebiegamiObciążona maszyna, brak rozgrzewki, jeden przebiegPięć przebiegów, żądania rozgrzewające, mediana p95; porównuj „przed” i „po” w jednym kontenerze
Użytkownicy widzą nieaktualne dane po zmianie cacheTTL bez unieważniania przy zapisieWymagaj 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 tabeliBuduj bez blokowania (CREATE INDEX CONCURRENTLY w PostgreSQL) w osobnej migracji; zobacz praca z bazą danych w Codex
Diagnoza nie wskazuje żadnych podejrzanych commitówPłytki checkout w CI, więc git log widzi jeden commitPobierz pełną historię (fetch-depth: 0) w zaplanowanym zadaniu
Best-of-N wyczerpuje tygodniowy limitCztery próby dla mechanicznej zmianyUżywaj prób tylko tam, gdzie strategie się różnią; jedna próba dla znanej poprawki