Skip to content

Un paquet de démonstration : l'outil ET l'application qu'il observe - #53

Merged
Beennnn merged 3 commits into
mainfrom
claude/reprise-sans-binaires-fu4e2h
Sep 7, 2026
Merged

Un paquet de démonstration : l'outil ET l'application qu'il observe#53
Beennnn merged 3 commits into
mainfrom
claude/reprise-sans-binaires-fu4e2h

Conversation

@Beennnn

@Beennnn Beennnn commented Sep 7, 2026

Copy link
Copy Markdown
Owner

bin/demo-kit.sh assemble un zip qui rejoue la campagne publiée sur n'importe quelle machine ayant un JDK 21, sans construire le dépôt et sans réseau.

Ce que ça porte

runtime-xray.jar l'édition complète — les cinq composants voyagent dedans et se déposent dans ~/.runtime-xray au premier lancement
sample-app.jar + libs/ l'application observée et ses deux dépendances, nommées dans son manifeste
src/ ses 27 sources — c'est ce qu'affiche le panneau de code
demo.sh, demo.cmd les trois exécutions de la démo, mêmes noms, mêmes méthodes racines, mêmes filtres
README.txt, SHA256SUMS.txt

La différence avec bin/offline-kit.sh est le point : celui-là porte l'outil vers une application qu'on a déjà, celui-ci porte une application aussi.

Deux décisions prises en l'exécutant, pas en le lisant

Les deux auraient livré un paquet qui démontre le contraire de ce pour quoi il existe.

--classes ne nomme que sample-app.jar. Ajouter libs/commons-lang3.jar — que l'application atteint vraiment, et que la démo publiée passait vraiment — met ses 231 classes dans la couverture, dont aucune n'a sa source dans le paquet. Le rapport s'ouvrait sur :

   sources: 27/258 measured class(es) have their source
   231 measured class(es) out of 258 have no source.

Exactement le mode de défaillance que cet outil existe pour expliquer, sur le premier écran d'une démonstration.

--attach-after se calcule sur la charge. Les valeurs se capturent en s'attachant à la JVM vivante, et les 8 s par défaut ne conviennent qu'à la charge complète. Raccourcir la campagne — ce que le README propose — faisait finir l'application avant l'attachement :

   ⚠️ the application finished before attachment (8 s): values not captured.

Un tiers de ce que montre le rapport disparaissait, avec un avertissement que personne n'aurait relié au ITERATIONS= qu'il venait de taper.

Vérification

Testé comme le ferait quelqu'un qui reçoit le zip : décompressé ailleurs, ~/.runtime-xray vidé et MAVEN_REPO_LOCAL pointé sur un répertoire vide. Le jar complet a déposé ses cinq composants tout seul — c'est le chemin embarqué, celui qui n'était jamais exercé ici puisque le dépôt Maven local le précède.

Le README.txt du paquet dit aussi ce qu'on ne verra pas sous Windows, et que c'est la plateforme et non le paquet : async-profiler n'y publie aucun binaire, la couverture et les valeurs marchent identiquement, et le rapport le dit maintenant là où l'arbre serait.

🤖 Generated with Claude Code

https://claude.ai/code/session_01J956wjynbd7fkZx4HpjHzP


Generated by Claude Code

Le kit hors ligne porte l'outil vers une application qu'on a déjà. Celui-ci porte
une application AUSSI — sample-app.jar, ses dépendances et ses sources — pour
qu'on puisse rejouer la campagne publiée avec un JDK et rien d'autre, sans
construire le dépôt et sans réseau : l'édition complète dépose ses cinq
composants dans ~/.runtime-xray au premier lancement.

Deux décisions ont été prises en l'exécutant, pas en le lisant, et les deux
auraient livré un paquet qui démontre le contraire de ce pour quoi il existe.

--classes ne nomme que sample-app.jar. Ajouter libs/commons-lang3.jar — que
l'application atteint vraiment, et que la démo publiée passait vraiment — met ses
231 classes dans la couverture, dont aucune n'a sa source dans le paquet. Le
rapport s'ouvrait sur « 231 classes mesurées sur 258 n'ont pas leur source » :
exactement le mode de défaillance que cet outil existe pour expliquer, sur le
premier écran d'une démonstration.

--attach-after se calcule sur la charge. Les valeurs se capturent en s'attachant
à la JVM vivante, et les 8 s par défaut ne conviennent qu'à la charge complète.
Raccourcir la campagne — ce que le README propose — faisait finir l'application
avant l'attachement, et un tiers de ce que montre le rapport disparaissait avec
un avertissement que personne n'aurait relié au ITERATIONS= qu'il venait de taper.

Le README dit aussi ce qu'on ne verra pas sous Windows, et que c'est la
plateforme et non le paquet : async-profiler n'y publie aucun binaire.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J956wjynbd7fkZx4HpjHzP
Mesuré en exécutant le paquet, pas en le lisant. Les trois runs observés de la
même façon :

  RoutePlanner::travelTimeMinutes    8 M itérations →  31 s
  RoutePlanner::travelTimeMinutes   24 M itérations → 206 s
  Terrain::slowdownFactor           24 M itérations → coupé à 600 s

Terrain::slowdownFactor est appelée plusieurs fois par itinéraire là où l'autre
l'est une seule fois, et capturer les valeurs veut dire tracer CHAQUE invocation.
Donner le même nombre d'itérations aux trois runs — ce que fait la démonstration
publiée — rend le deuxième dix fois plus long que les autres, et ici l'outil a dû
l'arrêter : « stopped after 600 s (safety limit) ». Un paquet de démonstration
dont le run du milieu se fait tuer démontre le garde-fou.

Chaque run est donc dimensionné pour sa propre racine, à partir d'un WORKLOAD
unique : /4 pour le premier, /8 pour celui qui trace la méthode chaude, entier
pour le dernier. La forme de la campagne ne bouge pas — trois exécutions, trois
racines, trois filtres — seul le nombre d'échantillons derrière les pourcentages.

Le même test a par ailleurs prouvé le chemin embarqué, jamais exercé ici puisque
le dépôt Maven local le précède : avec ~/.runtime-xray vide et MAVEN_REPO_LOCAL
sur un répertoire vide, les cinq composants sortent du jar complet.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J956wjynbd7fkZx4HpjHzP
Le correctif précédent dimensionnait le run du milieu à WORKLOAD/8 pour ne plus
franchir le garde-fou. Il ne le franchissait plus, et ne récoltait plus que 64
échantillons : un arbre qui ne montre rien, ce qui remplace un défaut par un
autre. Les points mesurés sur Terrain::slowdownFactor, tous observés pareil :

  1 M →  4 s,  64 mesures      4 M → 24 s, 279 mesures
  2 M →  5 s, 116 mesures     24 M → coupé à 600 s

Au-delà de 4 M, allonger le run n'achète presque plus d'échantillons : le temps
part dans le traçage, qui n'est pas dans lab/sample/terrain/* et ne compte donc
pas. C'est précisément ce que ce run est là pour montrer — ce que fait un filtre
étroit — donc le prolonger n'aurait rien démontré de plus.

D'où la moitié du WORKLOAD pour les deux premiers runs et le WORKLOAD entier pour
le dernier : moins de deux minutes en tout. La démo publiée donne 24 M aux trois
et paie onze minutes, sur la machine où elle a été enregistrée ; le README dit
comment s'en rapprocher pour qui veut attendre.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01J956wjynbd7fkZx4HpjHzP
@Beennnn
Beennnn marked this pull request as ready for review September 7, 2026 06:32
@Beennnn
Beennnn merged commit bfd5b3c into main Sep 7, 2026
3 checks passed
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.

2 participants