Migracja skryptów CLI z Node.js na Rust: 5-10x szybsze działanie dzięki AI
Skrypty CLI oparte na Node.js 18 przetwarzały pliki projektu: rekurencyjnie przeszukiwały katalogi, liczyły linie kodu według rozszerzeń oraz parsowały Markdown z wyodrębnianiem front matteru. Na MacBooku M4 operacja zajmowała 2 sekundy. Na Intel Core i5-1035G1 z 8 GB RAM — aż 8 sekund. Różnica staje się odczuwalna przy wielokrotnym uruchamianiu.
Przepisanie kodu na Rust z wykorzystaniem asystenta AI (Claude Code) przyniosło 5-10-krotne przyspieszenie. Kod powstawał iteracyjnie: kompilator Rust wskazywał błędy, a AI automatycznie je korygował, bez konieczności ręcznej ingerencji.
Kontekst techniczny zadań
Skrypty rozwiązywały typowe problemy:
- Rekurencyjne przeszukiwanie za pomocą globów oraz agregacja statystyk dotyczących liczby linii w plikach.
- Parsowanie Markdown, wyodrębnianie front matteru i budowanie indeksu.
Wąskie gardło: sekwencyjne uruchamianie promisów oraz niezoptymalizowany glob. Node.js dałoby się jeszcze dopracować, ale Rust sprawdza się znacznie lepiej w operacjach przeszukiwania plików i zadaniach obciążających CPU — podobnie jak ripgrep czy fd w porównaniu do grep/find (10-20x szybciej).
W eksperymencie skupiono się na prostych zadaniach: każdy skrypt liczył około 200 linii kodu, nie korzystał z sieci, wielowątkowości ani złożonej logiki biznesowej.
Proces migracji z wykorzystaniem AI
- Przekazanie kodu źródłowego do Claude Code z instrukcją przepisania go na Rust.
- Kompilator wskazywał błędy typów i czasu życia zmiennych (
lifetimes) — AI korygował je w kolejnych iteracjach. - Przegląd końcowego kodu: 20 minut poświęcone na weryfikację logiki i porównanie z oryginałem.
Kod w Rust okazał się czytelny. Ścisła typizacja stworzyła pętlę sprzężenia zwrotnego: precyzyjne komunikaty kompilatora działały jak automatyczny code review dla AI. Nie było potrzeby ręcznego debugowania ani zgłębiania składni Rusta.
Dystrybucja plików binarnych
Pliki binarne generowane przez Rust są zależne od platformy, więc przechowywanie ich w repozytorium Git jest nieefektywne. Przyjęto rozwiązanie analogiczne do esbuild: pakiety npm zawierające prekompilowane binaria dla poszczególnych systemów. Polecenie npm install pobiera odpowiedni plik wykonywalny, bez konieczności dołączania kodu źródłowego.
Wyniki testów wydajności
| Maszyna | Node.js 18 | Rust | Przyspieszenie |
|---------------------|------------|----------|----------------|
| i5-1035G1, 8 GB | ~8 s | 1-1.5 s | 5-7x |
| MacBook M4 | ~2 s | ~0.3 s | ~6x |
Wynik jest typowy dla operacji łączących I/O plików z agregacją danych na CPU. Podobnie jak w przypadku ccusage: na wybranych zadaniach przyspieszenie sięga nawet 1000x.
Ograniczenia tego podejścia
W zależności od typu zadania:
- Operacje sieciowe lub bazy danych — brak zysku (Rust nie przyspieszy czasu oczekiwania).
- Skrypty działające poniżej 1 s — migracja nie jest opłacalna.
- Zawsze profiluj kod: użyj
node --proflubtime.
W kontekście generowania przez AI:
- Tylko dla prostych skryptów. Złożone architektury (cechy/
traits,async) nie nadają się do tego. - Utrzymywanie kodu generowanego przez AI generuje dług techniczny.
- Zespół bez dostępu do AI może mieć trudności ze zrozumieniem takiego kodu.
Kluczowe wnioski
- Połączenie Rusta i AI zapewnia 5-10-krotne przyspieszenie w zadaniach CLI opartych na przeszukiwaniu plików i obciążeniu CPU.
- Kompilator Rust automatyzuje debugowanie generowanego kodu.
- Dystrybucja przez npm z binariami dopasowanymi do platformy to praktyczne i sprawdzone rozwiązanie.
- Zawsze profiluj aplikację przed migracją; podejście sprawdza się wyłącznie w przypadku prostych, odizolowanych skryptów.
- Dług techniczny: uzależnienie od AI przy przyszłych refaktoryzacjach.
To podejście można łatwo skalować na podobne narzędzia, w których Node.js napotyka ograniczenia związane z I/O lub wydajnością CPU.
— Editorial Team
Brak komentarzy.