/** Ce que rapportent les compteurs, une fois la mesure arrêtée. */ export type Type_DrawCountersReport = { /** Passes de dessin de premier niveau (`Class_DrawingArea.drawElements`). */ passes: number; /** Dessins de flux, toutes passes confondues (`Class_LinkElement.drawElements`). */ link_draws: number; /** Le pire des flux : nombre de fois qu'il a été tracé dans une seule passe. */ max_draws_per_link: number; /** Identifiants des flux tracés plus d'une fois dans une même passe, du pire au moins pire. */ links_drawn_twice: string[]; /** os#1374 — Éventails de pointes recalculés (`Class_NodeElement.drawLinksArrow`). */ arrow_fans: number; /** Le pire des nœuds : nombre de fois que son éventail a été recalculé dans une seule passe. */ max_fans_per_node: number; /** * os#1375 — Qui a déclenché chaque passe, dans l'ordre. Une pile d'appel compacte par passe. * * Se compter est une chose, savoir QUI appelle en est une autre : c'est ce qui a permis * d'attribuer les dessins de flux à `updateLinksPositions` plutôt qu'au rendu. Le coût * (`new Error().stack`) est ici négligeable — deux ou trois passes par geste — alors qu'il * fausse tout dès qu'on le paie par dessin de flux : la sonde d'os#1372 le payait 18 230 fois * et ses durées ont dû être retirées. */ pass_origins: string[]; /** * os#1375 — Dessins de flux et eventails de chaque passe, dans l ordre. Deux passes ne coutent * pas forcement la meme chose : une passe sur un diagramme encore vide est gratuite, et la * supprimer ne gagnerait rien. Le total seul ne le dit pas. */ draws_per_pass: number[]; fans_per_pass: number[]; /** * os#1377 — Dessins de flux qui n'ont lieu DANS AUCUNE passe (`depth === 0`), et par qui. * * `draws_per_pass` ne les voit pas — ils sont jetés à la fermeture de passe — et * `link_draws` les compte sans dire d'où ils viennent : au chargement de CARTOFOB, 230 des * 441 dessins de flux étaient dans ce cas, donc hors de portée de la séparation * ancres/tracé d'os#1373, qui n'opère qu'à l'intérieur de `drawElements`. * * La pile est capturée au plus `MAX_OUT_OF_PASS_CAPTURES` fois : c'est le même arbitrage que * `pass_origins` — gratuit tant que le cas est rare (l'état sain en compte zéro), borné * quand il ne l'est pas. Le COMPTE, lui, reste exact. */ out_of_pass_draws: number; /** Origines des dessins hors passe, de la plus fréquente à la moins fréquente. */ out_of_pass_origins: [string, number][]; }; /** Démarre (ou redémarre) la mesure en repartant de zéro. */ export declare function startDrawCounters(): void; /** Arrête la mesure. Le rapport reste lisible après l'arrêt. */ export declare function stopDrawCounters(): void; /** Vrai tant que la mesure tourne. */ export declare function areDrawCountersEnabled(): boolean; /** * Ouvre une passe de dessin. Appelé par `Class_DrawingArea.drawElements`, qui DOIT appeler * `endDrawPass` en regard — un `try/finally`, parce qu'une passe qui jette laisserait la * profondeur en l'air et fausserait tout le reste de la mesure. */ export declare function beginDrawPass(): void; /** Ferme la passe ouverte par `beginDrawPass`. */ export declare function endDrawPass(): void; /** Compte un dessin de flux. Appelé par `Class_LinkElement.drawElements`. */ export declare function countLinkDraw(link_id: string): void; /** * os#1374 — Compte un recalcul d'éventail de pointes. Appelé par * `Class_NodeElement.drawLinksArrow`, qui repose les pointes de TOUS les flux d'un côté : c'est * l'unité de travail à ne pas refaire, pas le dessin d'une pointe isolée. */ export declare function countArrowFan(node_id: string): void; /** Photographie des compteurs, passe courante incluse. Ne remet rien à zéro. */ export declare function drawCountersReport(): Type_DrawCountersReport; /** * Pose les compteurs sur `window.sankey_draw_counters`, pour mesurer une bascule ou un * chargement depuis la console sans reconstruire de bundle instrumenté (ce qu'il a fallu faire * pendant tout os#1372) : * * sankey_draw_counters.start(); // ... geste à mesurer ... * sankey_draw_counters.report() * * Appelé depuis le constructeur de `Class_ApplicationData` — jamais au premier niveau du module, * cf. le commentaire de `state`. Sans condition de licence : l'objet ne fait rien tant que * `start()` n'a pas été appelé, et un outil de mesure qu'il faut une licence pour obtenir est un * outil qu'on n'a pas le jour où on en a besoin. */ export declare function exposeDrawCounters(): void;