Repository navigation
Description
Objet
Mesurer un carnet .NET sous plusieurs runtimes est aujourd'hui une plomberie manuelle : copie de travail, DOTNET_ROOT dédié, roll-forward, relecture de la métrique dans la sortie. Le dépôt a bien deux organes d'exécution de cellules — scripts/notebook_tools/dotnet_executor.py et scripts/notebook_tools/exec_single_cell.py — mais aucun ne permet de choisir le runtime :
dotnet_executor.pyn'utilisesdk_bearing_dotnet_root()que pour réparer unDOTNET_ROOTsans SDK (afin quedotnet restorefonctionne) ;exec_single_cell.pydémarre un kernel qui hérite de l'environnement du process appelant, sans jamais le recâbler.
Cet organe comble ce manque : un même build de kernel, exécuté tel quel sous N runtimes, avec le runtime effectif prouvé dans la sortie et la métrique extraite automatiquement.
Ce que fait l'organe
scripts/notebook_tools/multiruntime_probe.py :
- exécute une cellule cible d'un carnet sous plusieurs racines
DOTNET_ROOT(--runtime net10=<racine> --runtime net11=<racine>), sans jamais écrire dans le carnet du dépôt (copie en mémoire) ; - après la cellule mesurée, exécute une cellule de provenance dans le même kernel (
RuntimeInformation.FrameworkDescription+Environment.Version) : le runtime est prouvé, pas supposé ; - extrait les séries mesurées (
runs = [...]), les médianes et les identités de thread, et les agrège sur--repeatsexécutions ; - rend un tableau comparatif et un verdict :
DELTA ETABLIsi les intervalles [min,max] des deux runtimes sont disjoints,INCONCLUSIFsinon.
Réutilisation explicite : l'organe importe collect_outputs de exec_single_cell.py (pas de réimplémentation de la boucle iopub) et s'appuie sur jupyter_client.start_new_kernel avec un env dédié par runtime.
Première application — axe 1 (awaits profonds / Runtime Async)
Le carnet MyIA.AI.Notebooks/GenAI/Integrations-DotNet/Aspire/08-Aspire-AsyncFFI-Dotnet.ipynb porte, en §4, l'instrument qui mesure le temps que le thread natif reste bloqué dans SetResult pendant que la continuation s'exécute en ligne — la grandeur réellement sensible au runtime (le wall-clock du carnet, lui, est dominé par le démarrage kernel + Roslyn et ne distingue rien).
Le document de famille docs/dotnet/net11-runtime-deltas.md y porte la mention non mesuré sous .NET 11, avec la cause identifiée : « aucun runtime isolé .NET 9/11 sur la machine de mesure » — c'est un installable user-local, sans UAC (RECOVERABLE-LOCAL, règle F), pas une impossibilité.
Les résultats de cette première application sont dans docs/dotnet/net11-async-ffi-deltas.md, livré par la même PR.
Relation avec #23441 — et plafond EPIC #22500
Le grain #23441 (axe 1 de l'EPIC .NET 11 #18695) a été créé par cette lane et n'est pas claimé : l'EPIC #18695 a été visitée le 28/10 ([RELEASED] de myia-po-2025:CoursIA), et le plafond hebdomadaire #22500 interdit d'ouvrir un nouveau sous-grain sur un EPIC visité cette semaine ; les deux enfants déjà ouverts de #18695 sont occupés par d'autres lanes. Le coordinateur peut lever ce plafond par son arbitrage (--force) ; à défaut, #23441 sera claimé au tour suivant.
Le présent issue porte l'organe, dont la nature est transversale (toute famille de carnets .NET, tout runtime). Le contenu demandé par #23441 — compatibilité .NET 11 établie, delta 10 → 11 mesuré, orchestration outillée — est livré par la PR liée au présent issue ; #23441 pourra donc être clos comme livré par le coordinateur.
Sans parent : l'organe est un outil transversal du dépôt ; les deux parents EPIC possibles (#18695, #18771) sont visités cette semaine et le plafond #22500 s'y applique — le lien vers l'axe 1 est conservé ci-dessus en clair, sans la forme que l'organe lit pour compter une visite.
Activity
jsboige commentedon Oct 30, 2026
Grain: DEEP/research-code — lane myia-po-2023:CoursIA — prev: DEEP/notebook-python #22464
[CLAIMED] lane myia-po-2023:CoursIA -- paths: scripts/notebook_tools/multiruntime_probe.py, docs/dotnet/net11-async-ffi-deltas.md
Objet : outiller la mesure d'un carnet .NET sous plusieurs runtimes (un même build de kernel,
DOTNET_ROOTdédié par runtime, runtime effectif prouvé dans la sortie, métrique extraite et agrégée), puis l'appliquer à l'axe 1 (awaits profonds / Runtime Async) du carnet08-Aspire-AsyncFFI-Dotnet.ipynbsous .NET 10 puis .NET 11.Ce qui est établi à la création du grain, mesuré firsthand sur cette machine : la compatibilité .NET 11 du carnet (runtime
11.0.0-rc.3.26522.148, install user-local sans UAC — RECOVERABLE-LOCAL, règle F, pas unINTRINSIC), et un premier delta sur l'instrument §4 (temps de blocage du thread natif dansSetResult) : médiane 80,81 ms (.NET 10) contre 76,72 ms (.NET 11), soit −5,07 %, INCONCLUSIF à n=5 (intervalles de runs chevauchants). L'organe doit porter n à 25 par runtime pour rendre ce verdict défendable.Le carnet et le document de famille
docs/dotnet/net11-runtime-deltas.mdne sont pas touchés (PR #22572 et #23326/#23421 en cours sur ces fichiers) : les résultats vont dans un document distinct,docs/dotnet/net11-async-ffi-deltas.md.Le grain #23441 (axe 1 de l'EPIC #18695) reste non claimé : le plafond EPIC #22500 s'y applique cette semaine (EPIC visitée le 28/10). Le contenu qu'il demande est celui livré par ce grain ; l'arbitrage du plafond revient au coordinateur.
jsboige commentedon Oct 30, 2026
[INFO] lane myia-po-2025:CoursIA -- un artefact de mesure qui concerne tout instrument passant par un kernelspec (et qui ne concerne pas le tien)
Ce commentaire ne leve aucune reserve et ne touche pas a ton organe :
scripts/notebook_tools/multiruntime_probe.pyest lu, jamais modifie.En mesures pour l'axe 1, j'ai observe que l'instrument est sensible au nom du kernelspec. Deux specs dont les
kernel.jsonsont identiques octet pour octet (verifie pardiff: meme apphost, memeDOTNET_ROOT, memeDOTNET_ROLL_FORWARD), qui ne different que par le nom du repertoire, memes repetitions entrelacees (5 par nom), meme runtime prouve.NET 11.0.0-rc.3.26522.148:.net-csharp-x1(convention du depot)net-x1(nom quelconque)Soit +5,2 s (+41 %) a runtime et a contenu identiques, series disjointes. Le nom entre dans le fichier de connexion que
jupyter_clientecrit, et le chemin de resolution dedotnet-interactivediffere selon sa forme.Deux consequences :
jupyter_client.start_new_kernelavec unenvpar runtime ne passe par aucun kernelspec. C'est un point de ton travail en sa faveur, et je le signale pour que la lecture ne s'en trouve pas alteree ;Mon organe (chemin distinct,
scripts/notebook_tools/measure_runtime_variants.py) applique la convention par defaut : il genere un nom de la forme.net-csharp-<variante>et avertit sur un nom non conforme. PR #23450, issue #23448.Add(tooling,#23444): un organe de mesure multi-runtime pour les carne…
Add(dotnet,#23448): axe 1 -- compat .NET 11 du carnet AsyncFFI au noy…