Skip to content

Rust-Kurs: Ein-/Ausgabe, Performance messen und mehr Praxis in Async, CLI, Tests und API-Design (LRN-9) - #29

Open
hernstev97 wants to merge 1 commit into
mainfrom
feat/lrn-9-rust-io-profiling
Open

hernstev97 wants to merge 1 commit into
mainfrom
feat/lrn-9-rust-io-profiling

Conversation

@hernstev97

Copy link
Copy Markdown
Owner

Dem Rust-Kurs fehlte, was man für echte Systemarbeit braucht: Dateien, Prozesse und Netzwerk mit der Standardbibliothek kamen nicht vor, Performance messen auch nicht. Async, CLI, Tests und API-Design blieben bei den Grundlagen stehen (LRN-9, Abgleich vom 30.09. am 24.10. gegen main wiederholt, die Lücken bestanden unverändert).

Der PR füllt genau diese Lücken. Zwei neue Module gehen auf dem Handy, Werkstatt und Ausbauten sind fürs Arbeiten am PC. Rust wächst von 14 auf 17 Module und von 161 auf 215 Übungen.

Modul Ort Wörter* Übungen Inhalt
ein-ausgabe (neu) Unterwegs 3 064 14 OpenOptions, BufWriter (Drop schluckt Fehler), read_dir, atomar ersetzen per temp + sync_all + rename, Command ohne Shell, Exit-Status und Signale, Pipe-Deadlock, TCP als Bytestrom mit Zeilenprotokoll und Timeouts. Nur std, alles läuft durch pnpm verify.
performance-messen (neu) Unterwegs 3 271 13 Release vs. Debug, Instant, black_box, criterion-Ausgabe lesen (Konfidenzintervall, p-Wert, Rauschschwelle), divan, hyperfine 2.0, Flamegraphs lesen, Allokationen zählen. Dazu eine Diagnose in vier Schritten mit vorbereiteten Ausgaben.
profiling-werkstatt (neu) Am PC 3 355 13 Ein absichtlich langsames std-Programm wird in Runden schneller, von 3,142 s auf 63,5 ms und von 2,58 Mio. auf 271 Allokationen. Schritte: Profil profiling, hyperfine-Baseline, criterion mit --save-baseline, samply, genau eine Änderung je Runde, Messprotokoll.
async-rust Am PC 1 193 → 3 018 10 → 14 select! (Drop der Verlierer, biased;, gepinnter Timer), Cancellation Safety, Semaphore, CancellationToken/TaskTracker, oneshot/mpsc/broadcast/watch, tokio::net/tokio::fs, Streams, echte Meldung „future cannot be sent between threads safely“, #[tokio::test(start_paused = true)].
rust-praxis Am PC 1 319 → 2 532 10 → 14 clap derive mit Subcommands und env, stdin über -, var/var_os, BufWriter + stdout().lock() (gemessen 15× schneller), Broken Pipe, Strg+C mit ctrlc, TOML mit serde und Vorrang CLI > Env > Datei.
testen-qualitaet Am PC 1 264 → 2 422 10 → 14 env!("CARGO_BIN_EXE_…"), assert_cmd + predicates, tempfile, proptest mit echtem Shrinking, insta mit Filtern.
traits-generics Am PC 2 649 → 4 225 13 → 15 Neuer Abschnitt API-Design: TryFrom/FromStr, Builder, Typestate mit PhantomData, sealed und extension traits, #[non_exhaustive], #[must_use], Rust API Guidelines.

* Wie content:check zählt, also mit Code.

Dazu kommen das Level-3-Projekt Healthchecker (TCP, HTTP über tokio::net, Prozessaufruf, Semaphore, Strg+C, atomarer Bericht, Benchmark und Messprotokoll; abschluss-logwerk bleibt synchron), 12 Interview-Karten (jetzt 60), 12 Glossarbegriffe (jetzt 60), Spickzettel-Abschnitte zu I/O, Async-Werkzeugen, CLI/Tests, Messen und API-Design sowie ein neuer Track „Performance“ in area.yaml.

Handy: Lektion mit Marke Handy: Diagnose mit Text-Flamegraph Handy: criterion-Ausgabe lesen
Kopf des Moduls Ein- und Ausgabe mit der Marke Unterwegs, 360 px Übung 11 aus Performance messen: Flamegraph als Text und gefaltete Stacks passen in 360 px criterion-Ausgabe, umbrochen auf 34 Zeichen, mit Erklärung des Konfidenzintervalls

Lernpfad Rust am Desktop: neuer Track Performance mit „Unterwegs“ und „Am PC“

Lektion async-rust, Abschnitt select! mit gepinntem Timer

Projektseite Healthchecker für Dienste

Offene Entscheidung für dich: Beispiele mit fremden Crates prüfen?

pnpm verify überspringt Rust-Code mit fremden Crates. Auf main betrifft das 17 Stellen (async-rust 12, module-cargo 3, fehlerbehandlung 2), mit diesem PR 42. verify habe ich wie verlangt nicht geändert. Stattdessen sind alle 37 Stellen in den Modulen dieses PRs einmalig in einem Scratch-Cargo-Workspace im Worktree kompiliert und, wo es eine Ausgabe gibt, ausgeführt worden. Die Versionen waren fest: tokio 1.54.1, tokio-util 0.7.20, tokio-stream 0.1.19, clap 4.6.7, serde 1.0.229, toml 1.1.8, ctrlc 3.5.2, criterion 0.8.2, divan 0.1.21, proptest 1.12.0, insta 1.49.0, assert_cmd 2.2.2, predicates 3.1.4, tempfile 3.27.0. Der Workspace ist nicht Teil des PRs.

Die 37 so geprüften Stellen
  • async-rust (19): Lektionsblöcke 2–4 und 7–12 (Cargo.toml, join!, spawn, select!, CancellationToken/TaskTracker, Semaphore, tokio::net, Streams, #[tokio::test]); Übungen join-ergebnis, select-biased, await-future, spawn-besitz, bounded-channel, semaphore-permit, guard-block (Fehlermeldung echt erzeugt), timeout-handle, channel-worker, heartbeat-abbrechen
  • rust-praxis (5): Lektionsblöcke clap, serde/TOML, ctrlc; Übungen clap-subcommand, konfig-schichten
  • testen-qualitaet (5): Lektionsblöcke assert_cmd, Integrationstest gegen das Binary, insta; Übungen property-tautologie, cli-test-tempdir
  • performance-messen (4): criterion-Benchmark, iter_batched, divan; Übung zu-schnell-fuer-echt
  • profiling-werkstatt (4): die beiden Blöcke aus dem Werkstatt-Projekt, criterion-Benchmark; Übung wachstum-messen

Nicht von mir geprüft: die 5 Stellen in den unveränderten Modulen module-cargo und fehlerbehandlung.

Variante A: verify um ein Cargo-Projekt mit festen Versionen erweitern. Ein Workspace unter tooling/ mit eingechecktem Cargo.lock. verify legt jede Stelle mit fremder Crate als Beispiel oder Test hinein, baut alles in einem Lauf und vergleicht output-Übungen wie bei std-Code. Kosten: Die CI lädt und baut die Crates. Lokal brauchte der Bau aller Abhängigkeiten 19 s auf 24 Kernen, auf einem CI-Runner mit Cache sollte es deutlich unter einer Minute liegen (geschätzt, nicht gemessen). Fragmente ohne main brauchen ein Gerüst oder bleiben weiter ungeprüft. Versionen hebst du dann bewusst an, Inhalte und Lockfile gemeinsam. PR #28 ändert ebenfalls tooling/verify-code.ts.

Variante B: ungeprüft lassen. Die Inhalte nennen ihre Versionen, und der Playground-Link bleibt. Ändert sich eine Crate-API, merkt das erst der Lernende. Beispiele dafür gibt es schon in diesem PR: toml 1.x, die Deprecations in assert_cmd und into_path → keep in tempfile.

Empfehlung: A in schlanker Form. Nur kompilieren und output vergleichen, Fragmente ohne main weiter überspringen, die Versionen im Lockfile gleich denen in den Lektionen. Der Bestand hat sich mit diesem PR mehr als verdoppelt, und die einmalige Prüfung hier hat sich gelohnt (siehe unten). Grenze: Auch A prüft nicht die Cargo.toml-Schnipsel einer Lektion. Der Fehler mit dem fehlenden Feature io-util (unten) wäre nur aufgefallen, wenn verify mit genau den gezeigten Features baut.

Entscheidungen, die ich getroffen habe

  • Ort je Modul: Laut Handbuch hat ein Modul genau einen Ort. Die neuen Lese- und Diagnosemodule sind „Unterwegs“: Lesecode höchstens 34 Zeichen, bug höchstens 32, order als Prosa, keine Aufgabe braucht Cargo. Die vier ausgebauten Module sind „Am PC“. Sie enthalten Cargo-Praxisaufgaben mit fremden Crates und bestehenden Code über 34 Zeichen, den ich wegen der Fingerprints nicht umbrechen wollte. Neues zum Lesen von Compilerfehlern steht deshalb teils in PC-Modulen. Wenn du es lieber auf dem Handy hättest, wäre der nächste Schritt je ein eigenes Lesemodul.
  • Diagnose-Übungstyp aus LRN-22: Für Rust-Profile gibt es keine Emulation. „Vorbereitete Ausgaben“ (Variante A aus LRN-22) habe ich als Folge normaler Übungen gebaut, „Logparser-Fall (1/4) … (4/4)“. Einen neuen Übungstyp gibt es nicht.
  • Echte Messwerte: Alle Zahlen stammen aus echten Läufen auf einem Testrechner, umbrochen und gekürzt mit Kennzeichnung. samply lief hier nicht (perf_event_paranoid = 2, kein root). Die Flamegraph-Daten kommen deshalb aus pprof-rs, und die Lektion sagt das offen. Was dort zur samply-Oberfläche steht, beruht auf README und Firefox-Profiler-Doku, nicht auf eigener Ansicht. hyperfine 2.0 hat ein neues Ausgabeformat; gelehrt wird 2.0, mit einem Hinweis auf 1.x.
  • Bestand geschützt: Alle 43 alten Übungen der vier ausgebauten Module haben dieselbe ID und dieselben geprüften Teile. Der schreibende Agent und ein unabhängiger Reviewer haben das je per Diff gegen main bestätigt. Bei einigen alten Übungen sind nur resources genauer verlinkt.
  • Längen: traits-generics liegt jetzt bei 4 225 Wörtern mit Code, über dem Richtwert von 3 000. Das Issue wollte API-Design ausdrücklich dort. Die Alternative wäre ein eigenes Modul „API-Design“ hinter module-cargo, weil SemVer und pub dort erst vertieft werden; jetzt steht ein Vorwärtsverweis da. Die neuen Module liegen mit Code knapp über 3 000. Die Spur hat 17 Module, eins mehr als der Richtwert für neue Bereiche.
  • Nicht im Umfang: ownership, structs-enums und fehlerbehandlung haben auch nur rund 1 300 Wörter. Das Issue erklärt sie für abgedeckt, ich habe sie nicht angefasst.
  • KI-Regel: Jede neue Übung lässt selbst schreiben oder begründen. Das Healthchecker-Projekt sagt ausdrücklich: Boilerplate wie CI-YAML darf die KI liefern, Parser, Nebenläufigkeitsmodell, Tests und Messprotokoll nicht.

Geprüft

  • pnpm content:check rust: OK, 17 Module, 215 Übungen, 60 Karten, 5 Projekte, 60 Begriffe.
  • pnpm verify rust: 228 Prüfungen, 0 fehlgeschlagen. Neu sind alle std-Beispiele aus ein-ausgabe und performance-messen und die output-Übungen mit echten Dateien, Kindprozessen, Loopback-TCP und einem Allokationszähler.
  • Die vier neuen std-Bug-Übungen mit main kompilieren auch in ihrer fehlerhaften Fassung; der Fehler zeigt sich erst zur Laufzeit, wie im Prompt beschrieben. verify kompiliert jeweils die Korrektur. guard-block ist absichtlich ein Compilerfehler, die Meldung im Prompt ist echt.
  • pnpm test mit 329 Tests, pnpm lint und pnpm build: grün.
  • pnpm links rust: 541 URLs, 0 Probleme.
  • pnpm test:e2e lokal: 59 von 59 grün. Ein erster Lauf parallel zu zwei Review-Agenten scheiterte bei 6 Tests an Zeitüberschreitungen (Testing, PostgreSQL, VM, Viewport). Ohne Last waren alle grün. Auf CI kann der Viewport-Test unabhängig davon scheitern, wie auf main (LRN-31).
  • Im Browser durchgeklickt, auch mobil: Lektion und jede Übung der beiden Handy-Module per Playwright bei 360 px. Keine Codebox scrollt seitlich. Die einzige Meldung betrifft das leere Antwortfeld der output-Übungen (324/322 px). Das ist bei bestehenden Modulen wie ownership/3 genauso und liegt an der Plattform. Zwei akzeptierte Alternativantworten einer bug-Übung sind länger als 32 Zeichen; sie werden nur eingetippt, nie angezeigt.
  • Unabhängiges Review: zwei Reviewer, einer für die neuen Module, einer für die Ausbauten. Behoben wurde unter anderem:
    • Die Stream-Lektion nannte tokio-stream ohne das Feature io-util, und das Beispiel kompilierte damit nicht.
    • Die Übung api-erweiterbar stellte SemVer falsch dar: #[non_exhaustive] nachzurüsten ist selbst ein Major-Change.
    • Die Begründung zu black_box war falsch.
    • Ein Takt-Vergleich stimmte nicht.
    • Mehrere fehlende Alternativantworten sind ergänzt, ein Messprotokoll erfüllt jetzt seine eigene Checkliste.

Überschneidungen mit offenen PRs

Dieser PR ändert nur content/rust/. Kein offener PR (#21–#28) berührt diese Dateien, HANDBUCH.md und README.md habe ich nicht geändert. Inhaltlich berühren sich zwei Stellen:

🤖 Generated with Claude Code

… CLI, Tests und API-Design (LRN-9)

Neue Module: ein-ausgabe (Dateien, atomares Ersetzen, Command ohne Shell,
TCP-Zeilenprotokoll; nur std, unterwegs), performance-messen (criterion,
divan, hyperfine, Flamegraphs, Allokationen, Diagnose in vier Schritten;
unterwegs) und profiling-werkstatt (am PC ein langsames Programm messen,
profilieren und schneller machen). Neuer Track "Performance".

Ausgebaut: async-rust (select!, Cancellation Safety, Semaphore,
CancellationToken, Kanäle, tokio::net/fs, Streams, "future cannot be sent",
#[tokio::test]), rust-praxis (clap, stdin, Env, BufWriter, Broken Pipe,
Strg+C, TOML), testen-qualitaet (CARGO_BIN_EXE, assert_cmd, tempfile,
proptest, insta), traits-generics (API-Design). Bestehende Übungen sind in
ID und geprüften Teilen unverändert.

Dazu Level-3-Projekt healthchecker, 12 Interview-Karten, 12 Glossarbegriffe,
Spickzettel-Abschnitte. Rust: 14 → 17 Module, 161 → 215 Übungen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Oct 24, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: defaults
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 52939380-834f-40ef-bdeb-701455dac394
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@hernstev97

Copy link
Copy Markdown
Owner Author

CI-Stand: check, verify (6:40 min), convex grün; vm und links werden für reine Inhaltsänderungen übersprungen. e2e: Nach einem Neulauf der fehlgeschlagenen Jobs scheitert nur real content fits phone, tablet and desktop viewports (h1 erscheint nicht, das Muster aus LRN-31). Derselbe Test scheitert auf main (Lauf 39918103896). Der PostgreSQL-Test war flaky: im ersten Lauf „Page crashed“, beim Retry grün. Lokal liefen alle 59 e2e-Tests grün.

🤖 Generated with Claude Code

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant