Powrót do strony głównej

Rust zamiast Node.js: 5-10x przyspieszenie CLI

Artykuł opisuje migrację CLI-skryptów z Node.js na Rust za pomocą AI: przyspieszenie 5-10x na file traversal i zadaniach CPU. Szczegóły procesu, benchmarki, dystrybucja binarników i ograniczenia podejścia.

5-10x szybciej: Node.js CLI na Rust z AI
Advertisement 728x90

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:

Google AdInline article slot
  • 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.

Google AdInline article slot

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 |

|---------------------|------------|----------|----------------|

Google AdInline article slot

| 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 --prof lub time.

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

Advertisement 728x90

Czytaj dalej