Quickshell / panneau : mesurer et réduire le coût mémoire des contenus masqués #22

Closed
opened 2026-10-24 13:10:06 +00:00 by mathieu · 6 comments
Owner

Optimisation proposée, pas fuite démontrée

mathieu/SystemPanel.qml:212–226 instancie les quatre pages dans un StackLayout. Certaines sections de HomePage.qml, notamment les contrôles des pièces/lumières, restent instanciées une fois chargées même lorsqu’elles sont repliées ou la page masquée. Masquer n’équivaut pas à détruire.

Le relevé ponctuel d’une instance de longue durée ne permet pas d’attribuer son empreinte ni d’affirmer une fuite. Un test QML complémentaire a par ailleurs conservé identité, déploiement et focus des cartes de notifications après une mise à jour d’horloge : ne pas partir d’une hypothèse de churn systématique non reproduite.

Résultat attendu

  • Établir un protocole reproductible sur données synthétiques : repos, premier affichage, onglets, sections repliées/déployées et cycles ouverture/fermeture.
  • Mesurer RSS/PSS, objets vivants et coûts d’instanciation ; distinguer caches, allocations retenues et croissance persistante.
  • Différer uniquement les corps lourds dont l’instanciation n’est pas nécessaire ; préserver explicitement les états UX souhaités et les services réellement partagés.
  • Ne pas arrêter les notifications, la dictée ni le suivi Keepawake parce que leur page est cachée.

Validation

  • Comparatif avant/après et plateau après cycles ; pas de succès annoncé sur un seul point RSS.
  • Gain mesuré sans latence de première ouverture disproportionnée ni perte de focus/navigation clavier.
  • Deux écrans, déplacement du panneau, fermeture/réouverture et données absentes.
  • Aucun état HA réel ni historique personnel dans les fixtures ou rapports.

Articulation

Après les bornes de ressources #12 / #13, pour ne pas masquer ces défauts par une optimisation UI. Pas de refonte de framework.

Référence

Revue du code au commit 5e350a8, avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11.

  • with pi 🥧
## Optimisation proposée, pas fuite démontrée `mathieu/SystemPanel.qml:212–226` instancie les quatre pages dans un `StackLayout`. Certaines sections de `HomePage.qml`, notamment les contrôles des pièces/lumières, restent instanciées une fois chargées même lorsqu’elles sont repliées ou la page masquée. Masquer n’équivaut pas à détruire. Le relevé ponctuel d’une instance de longue durée ne permet pas d’attribuer son empreinte ni d’affirmer une fuite. Un test QML complémentaire a par ailleurs conservé identité, déploiement et focus des cartes de notifications après une mise à jour d’horloge : ne pas partir d’une hypothèse de churn systématique non reproduite. ## Résultat attendu - Établir un protocole reproductible sur données synthétiques : repos, premier affichage, onglets, sections repliées/déployées et cycles ouverture/fermeture. - Mesurer RSS/PSS, objets vivants et coûts d’instanciation ; distinguer caches, allocations retenues et croissance persistante. - Différer uniquement les corps lourds dont l’instanciation n’est pas nécessaire ; préserver explicitement les états UX souhaités et les services réellement partagés. - Ne pas arrêter les notifications, la dictée ni le suivi Keepawake parce que leur page est cachée. ## Validation - [x] Comparatif avant/après et plateau après cycles ; pas de succès annoncé sur un seul point RSS. - [x] Gain mesuré sans latence de première ouverture disproportionnée ni perte de focus/navigation clavier. - [x] Deux écrans, déplacement du panneau, fermeture/réouverture et données absentes. - [x] Aucun état HA réel ni historique personnel dans les fixtures ou rapports. ## Articulation Après les bornes de ressources #12 / #13, pour ne pas masquer ces défauts par une optimisation UI. Pas de refonte de framework. ## Référence Revue du code [au commit `5e350a8`](https://git.2027a.net/mathieu/dotfiles/src/commit/5e350a8945af99e6e6b1c7f472fb7529a26a1826/quickshell/), avec Quickshell 0.3.2. Les 18 suites existantes passent ; les cas ci-dessous complètent cette couverture. Chantier : #11. - with pi 🥧
Author
Owner

Baseline synthétique parent sur e8ec9ad : vrai HomePage.qml et composants de lumières, Quickshell0.3.2 hors écran/backend logiciel, HOME/bus/audio privés, faux bridge sans connexion HA. La page est inactive et les lumières repliées ; charger un inventaire n’émet aucune commande.

Inventaire Items visuels LightRow instanciés, même page inactive PSS ponctuelle
0 lumière 110 0 39 401 Kio
32 lumières 631 32 45 556 Kio
128 lumières 2 167 128 68 596 Kio

Après déploiement puis fermeture, les 128 LightRow existent encore (2 167 items). Cette mesure prouve une instanciation masquée évitable, pas une fuite ni un gain après correction. PSS est un relevé ponctuel sensible au partage de bibliothèques, pas une limite ni un profil complet. Un comparatif répété, cycles et latence/focus seront nécessaires pour accepter l’optimisation.

Le protocole n’inclut aucun serveur de notifications ; il peut donc préparer la baseline pendant #13 sans modifier ni masquer les bornes de notifications. L’implémentation de #22 attendra celles-ci. Fixture/mesures temporaires conservées hors dépôt pour comparaison, aucun fichier projet modifié.

  • with pi 🥧
Baseline synthétique parent sur `e8ec9ad` : vrai `HomePage.qml` et composants de lumières, Quickshell0.3.2 hors écran/backend logiciel, HOME/bus/audio privés, faux bridge sans connexion HA. La page est inactive et les lumières repliées ; charger un inventaire n’émet aucune commande. | Inventaire | Items visuels | LightRow instanciés, même page inactive | PSS ponctuelle | |---|---:|---:|---:| | 0 lumière | 110 | 0 | 39 401 Kio | | 32 lumières | 631 | 32 | 45 556 Kio | | 128 lumières | 2 167 | 128 | 68 596 Kio | Après déploiement puis fermeture, les 128 LightRow existent encore (2 167 items). Cette mesure prouve une instanciation masquée évitable, **pas une fuite ni un gain après correction**. PSS est un relevé ponctuel sensible au partage de bibliothèques, pas une limite ni un profil complet. Un comparatif répété, cycles et latence/focus seront nécessaires pour accepter l’optimisation. Le protocole n’inclut aucun serveur de notifications ; il peut donc préparer la baseline pendant #13 sans modifier ni masquer les bornes de notifications. L’implémentation de #22 attendra celles-ci. Fixture/mesures temporaires conservées hors dépôt pour comparaison, aucun fichier projet modifié. - with pi 🥧
Author
Owner

Intégré sur main d5f3472, contenu distant exact des6fichiers vérifié. Candidate finale signée6f52da2 (C547fbf0 +correctionmétadonnées), revue indépendante sans constat après correction des séquences de nom hors-ligne/préselection. Gate parent combiné26/26 suites passent, dont16cas HomePage,21garde et11helper.

Acceptation technique : optimisation à froid, pas guérison de fuite ni promesse de RAM plus basse après usage. Corps d’une pièce créé à sa première consultation réelle puis conservé ; flags booléens prunés par inventaire, au plus l’inventaire eager original, pas de cache de QObjects/framework/GC forcé. Contrôles masqués inactifs et sans dépendance aux valeurs live ; états ID/focus/pointer-annulation conservés. Métadonnées sans changement d’ordre préservent les instances ; l’ordre alphabétique réel reste prioritaire lorsqu’un nom change de position. Notifications/dictée/Keepawake ne sont pas arrêtés.

Mesures finales exactes6f52da2 seulement (pas les anciennesC547plus favorables) : deux workloads128lampes puis2×128, deux paires avant/après chacun,60cycles naturels/GCnonforcé,992observations privées. Gain froid RSS25–28Mio (une pièce) et62–64Mio (deux). Après usage, résultats mixtes : une paire+8,98MioRSS/+9,08MioPSS au point+5s, seconde paire comparable ; stresschangementdepièces moyennes tardives~+4,4MioRSS/+4,6MioPSS, pics échantillonnés~+1MioRSS et pointfinal~−3Mio. Ce surcoût modéré et variable est accepté au regard du gain tant que les pièces restent non consultées. A/Bavaient de vrais coûts de churn et n’ont pas été retenues. Objets bornés/plateau sur60cycles ne prouvent pas absence de fuite lente ; pas de retour froid revendiqué.

Coût de première ouverture mesuré, accepté mais pas neutre : huit paires de processus natifs frais, vrai Return vers frame après oracle128contrôles/layout valides : médiane13,25→141,62ms, supplément126–137ms. Travail auparavant payé au démarrage déplacé vers la première consultation ; environ0,14s pour ce stress128contrôles jugé non disproportionné, pas une SLA ni une promesse sur matériel lent. Pas de gain CPU allégué pour cette page.

Deux écrans validés au niveau de la page Qt : deux vrais QScreen virtuels natifs Fixture-A1280×1440 etFixture-B1920×1080, même QQuickWindow A→B→A/B, largeurs360/560/960, identités/groupe/membres/focus conservés ; fenêtre réellement fermée/déplacée hors-ligne/réouverte, Tab, inventaire absent/restauré, zéro commande/WARN/ERROR. Ce n’est PAS une validation physique de moniteurs, LayerShell, compositor focus/hotplug/DPI ni du déplacement complet SystemPanel. Limite conservée explicitement ; le code modifié est HomePage/contrôles, pas l’ancrage du panneau.

Protocole/scripts/hashes/échantillons conservés hors dépôt : /tmp/home-lazy-visited.Kqsk3aoD/final/ (mémoire finale), /tmp/home-screens-latency.8W5OrxQl/ (17processus natifs), rapports wave7/home-lazy-visited.md etwave10/home-screens-latency.md. Bus/audio/HOME/XDG privés, aucun état HA/historique personnel/écran ou touche hôte. Publication≠activation : checkout actif non avancé.

  • with pi 🥧
Intégré sur main [d5f3472](https://git.2027a.net/mathieu/dotfiles/commit/d5f3472c5867f0b80d3c0049164a5f25b0e88ee3), contenu distant exact des6fichiers vérifié. Candidate finale signée6f52da2 (C547fbf0 +correctionmétadonnées), revue indépendante sans constat après correction des séquences de nom hors-ligne/préselection. **Gate parent combiné26/26 suites passent**, dont16cas HomePage,21garde et11helper. **Acceptation technique : optimisation à froid, pas guérison de fuite ni promesse de RAM plus basse après usage.** Corps d’une pièce créé à sa première consultation réelle puis conservé ; flags booléens prunés par inventaire, au plus l’inventaire eager original, pas de cache de QObjects/framework/GC forcé. Contrôles masqués inactifs et sans dépendance aux valeurs live ; états ID/focus/pointer-annulation conservés. Métadonnées sans changement d’ordre préservent les instances ; l’ordre alphabétique réel reste prioritaire lorsqu’un nom change de position. Notifications/dictée/Keepawake ne sont pas arrêtés. **Mesures finales exactes6f52da2 seulement** (pas les anciennesC547plus favorables) : deux workloads128lampes puis2×128, deux paires avant/après chacun,60cycles naturels/GCnonforcé,992observations privées. Gain froid RSS~25–28Mio (une pièce) et~62–64Mio (deux). Après usage, résultats mixtes : une paire+8,98MioRSS/+9,08MioPSS au point+5s, seconde paire comparable ; stresschangementdepièces moyennes tardives~+4,4MioRSS/+4,6MioPSS, pics échantillonnés~+1MioRSS et pointfinal~−3Mio. Ce surcoût modéré et variable est accepté au regard du gain tant que les pièces restent non consultées. A/Bavaient de vrais coûts de churn et n’ont pas été retenues. Objets bornés/plateau sur60cycles ne prouvent pas absence de fuite lente ; pas de retour froid revendiqué. **Coût de première ouverture mesuré, accepté mais pas neutre :** huit paires de processus natifs frais, vrai Return vers frame après oracle128contrôles/layout valides : médiane13,25→141,62ms, supplément126–137ms. Travail auparavant payé au démarrage déplacé vers la première consultation ; environ0,14s pour ce stress128contrôles jugé non disproportionné, pas une SLA ni une promesse sur matériel lent. Pas de gain CPU allégué pour cette page. **Deux écrans validés au niveau de la page Qt :** deux vrais QScreen virtuels natifs Fixture-A1280×1440 etFixture-B1920×1080, même QQuickWindow A→B→A/B, largeurs360/560/960, identités/groupe/membres/focus conservés ; fenêtre réellement fermée/déplacée hors-ligne/réouverte, Tab, inventaire absent/restauré, zéro commande/WARN/ERROR. Ce n’est PAS une validation physique de moniteurs, LayerShell, compositor focus/hotplug/DPI ni du déplacement complet SystemPanel. Limite conservée explicitement ; le code modifié est HomePage/contrôles, pas l’ancrage du panneau. Protocole/scripts/hashes/échantillons conservés hors dépôt : `/tmp/home-lazy-visited.Kqsk3aoD/final/` (mémoire finale), `/tmp/home-screens-latency.8W5OrxQl/` (17processus natifs), rapports wave7/home-lazy-visited.md etwave10/home-screens-latency.md. Bus/audio/HOME/XDG privés, aucun état HA/historique personnel/écran ou touche hôte. Publication≠activation : checkout actif non avancé. - with pi 🥧
mathieu 2026-10-24 18:38:32 +00:00
mathieu 2026-10-24 19:07:13 +00:00
Author
Owner

Clôture corrigée après rejet de l’audit final : le test à deux vrais QScreen virtuels déplaçait une fenêtre QtQuick contenant HomePage, sans SystemPanel/PanelWindow/LayerShell. Il ne couvre donc pas le critère explicite « deux écrans, déplacement du panneau ». Le code final90f0cd8, les26suites, les mesures mémoire/latence et revues restent valides, mais l’acceptation est incomplète. #22 et #11 sont rouverts ; le suivi de chantier a été rétabli sur leurs véritables descendants. Prochaine étape : panneau complet dans un compositeur privé headless à deux sorties, services/données factices, aucune connexion/commande à la session hôte. Si impossible sans action sensible, demander à Mathieu une validation ou modification explicite du critère ; aucune acceptation n’est inférée.

  • with pi 🥧
Clôture corrigée après rejet de l’audit final : le test à deux vrais QScreen virtuels déplaçait une fenêtre QtQuick contenant HomePage, **sans SystemPanel/PanelWindow/LayerShell**. Il ne couvre donc pas le critère explicite « deux écrans, déplacement du panneau ». Le code final90f0cd8, les26suites, les mesures mémoire/latence et revues restent valides, mais l’acceptation est incomplète. #22 et #11 sont rouverts ; le suivi de chantier a été rétabli sur leurs véritables descendants. Prochaine étape : panneau complet dans un compositeur privé headless à deux sorties, services/données factices, aucune connexion/commande à la session hôte. Si impossible sans action sensible, demander à Mathieu une validation ou modification explicite du critère ; aucune acceptation n’est inférée. - with pi 🥧
Author
Owner

Précontrôle privé arrêté par sécurité avant tout lancement : Hyprland installé0.56.2/Aquamarine0.15.1 initialise DRM/libseat/input et exige un allocateurGBM adossé DRM ; pas de mode headless-only sûr dans cette version vérifiée. Weston15 installé dispose de headless/pixman mais pas des protocoles wlr-layer-shell/Hyprland-focus-grab nécessaires au vrai panneau. Aucun compositeur, accès matériel, paquet, substitution offscreen/mock ou action sur la session hôte lancé.

Le critère reste ouvert. Prochaine décision demandée à Mathieu : autoriser un panneau complet de démonstration à données/services factices sur son compositeur actuel/deux sorties (focus temporaire), sans avancer/recharger sa configuration active ni commandeHA/appareil/session/presse-papiers ; sinon conserver ce contrôle en attente ou réviser explicitement le critère. Aucun accord n’est inféré des validations18/19.

  • with pi 🥧
Précontrôle privé arrêté par sécurité avant tout lancement : Hyprland installé0.56.2/Aquamarine0.15.1 initialise DRM/libseat/input et exige un allocateurGBM adossé DRM ; pas de mode headless-only sûr dans cette version vérifiée. Weston15 installé dispose de headless/pixman mais pas des protocoles wlr-layer-shell/Hyprland-focus-grab nécessaires au vrai panneau. Aucun compositeur, accès matériel, paquet, substitution offscreen/mock ou action sur la session hôte lancé. Le critère reste ouvert. Prochaine décision demandée à Mathieu : autoriser un panneau complet de démonstration à données/services factices sur son compositeur actuel/deux sorties (focus temporaire), sans avancer/recharger sa configuration active ni commandeHA/appareil/session/presse-papiers ; sinon conserver ce contrôle en attente ou réviser explicitement le critère. Aucun accord n’est inféré des validations18/19. - with pi 🥧
Author
Owner

Mathieu a maintenant explicitement répondu « oui, ok » à la demande d’afficher un panneau de démonstration à données factices sur ses deux écrans réels, avec focus temporaire, sans avancer/recharger sa configuration active ni commandeHA/appareil/session/presse-papiers. Objectif repris ; aucune modification du critère demandée/inférée.

Test borné lancé en préparation : vraiSystemPanel/PanelWindow/LayerShell et ses4pages inchangés au90f0cd8, dépendances de données factices, HOME/XDG/bus/audio privés, seule connexion d’affichage au compositeur actuel autorisée. Fermeture/cleanup/focus de retour prévus ; pas de nouveau compositeur/paquet/matériel. Le précontrôle privé échoué reste documenté, pas remplacé par un fauxPASS. Validation/revue attendues avant clôture.

  • with pi 🥧
Mathieu a maintenant explicitement répondu « oui, ok » à la demande d’afficher un panneau de démonstration à données factices sur ses deux écrans réels, avec focus temporaire, sans avancer/recharger sa configuration active ni commandeHA/appareil/session/presse-papiers. Objectif repris ; aucune modification du critère demandée/inférée. Test borné lancé en préparation : vraiSystemPanel/PanelWindow/LayerShell et ses4pages inchangés au90f0cd8, dépendances de données factices, HOME/XDG/bus/audio privés, seule connexion d’affichage au compositeur actuel autorisée. Fermeture/cleanup/focus de retour prévus ; pas de nouveau compositeur/paquet/matériel. Le précontrôle privé échoué reste documenté, pas remplacé par un fauxPASS. Validation/revue attendues avant clôture. - with pi 🥧
Author
Owner

Validation complémentaire terminée après l’autorisation explicite « oui, ok » de Mathieu : vraiSystemPanel/PanelWindow/LayerShell avec ses4pages de production90f0cd8, données/services factices, déplacé sur les2sorties existantes A→B→A puis bord droit/haut, fermé surB et rouvert surA. Ce n’est plus le simple QQuickWindow de la preuve initiale.18instantanés passent ; le compositeur identifie lePID du test sur chaque sortie et les protocoles Wayland confirment surfaces layer-shell, output-enter, configuration, entrée clavier et focus-grab. Rotation/logicalité/barre réservée prises en compte. Les contrôles/membres/états/focus et navigation sont conservés, données hors-ligne/absentes/restaurées couvertes ; le faux oracle de mauvaise sortie échoue comme attendu.

Le panneau a été visible 5,48secondes, puis fermé ; son client/watchdog sont sortis, état des sorties et surfaces hôtes identique, focus d’origine revenu automatiquement sans dispatch de restauration. Aucune commande de backend/appareil/session/presse-papiers, aucun receive de contenu ni capture d’écran. HOME/XDG/bus/audio privés, seule la connexion d’affichage autorisée au compositeur réel.39dépendancesQML/JS et90blobs de source inchangés ; checkout/instance habituels non avancés/rechargés.

Revue indépendante des preuves606a0f9a puis09dba92e/b4449195 : objection initiale couverte, notesP2 de classification des warnings et recette de reproduction corrigées/clarifiées, aucun constat restant. Le premier essai n’avait pas affiché de surface : nom synthétiqueIPCshow réservé, erreurCLI109 ; cause démontrée, puis tentative fraîche explicitement autorisée avec fixtureopenPanel etfauxchampmetrics.error corrigés. Aucun correctifQt/compositeur/panneau de production ou changement de runner.

**Pas de prétention warning-free :**4messages précis d’indisponibilité attendue des backends privés et21warningsQtWaylandtextinputdisableSurface sont conservés ; l’allowlist exacte rejette tout autreWARN/ERROR/FATAL/CRITICAL, zéro erreur QMLtype/référence/binding/assignment. La navigation/focus native est vérifiée malgré ces transitoires ; aucune correction universelle de textinput revendiquée.

Preuves privées : /tmp/authorized-full-panel-retry.oJzxXYh7/ (18snapshots natifs/états, sources/hashes, logs protocolaires FILTRÉS) ; vérification parent etallowlist dans /tmp/pi-quickshell-tickets.7b0ahn/. Ne pas publier les logs Wayland bruts (descriptions matériel). La recette de relecture est l’inspection des fichiers retenus et le nouveau classificateur à sortie séparée ; ne pas relancer le driver live ni l’ancienverify-evidence (queries/proc/écritures) sans nouvelle autorisation/revue. Ce dernier reste historique.

Le critère « deux écrans, déplacement du panneau, fermeture/réouverture et données absentes » est maintenant accepté sur cette preuve complète. Le code et le gate26/26 au90f0cd8 restent inchangés ; aucune nouvelle mesure de ressources n’a été substituée.

  • with pi 🥧
Validation complémentaire terminée après l’autorisation explicite « oui, ok » de Mathieu : **vraiSystemPanel/PanelWindow/LayerShell avec ses4pages de production90f0cd8**, données/services factices, déplacé sur les2sorties existantes A→B→A puis bord droit/haut, fermé surB et rouvert surA. Ce n’est plus le simple QQuickWindow de la preuve initiale.18instantanés passent ; le compositeur identifie lePID du test sur chaque sortie et les protocoles Wayland confirment surfaces layer-shell, output-enter, configuration, entrée clavier et focus-grab. Rotation/logicalité/barre réservée prises en compte. Les contrôles/membres/états/focus et navigation sont conservés, données hors-ligne/absentes/restaurées couvertes ; le faux oracle de mauvaise sortie échoue comme attendu. Le panneau a été visible **5,48secondes**, puis fermé ; son client/watchdog sont sortis, état des sorties et surfaces hôtes identique, focus d’origine revenu automatiquement **sans dispatch de restauration**. Aucune commande de backend/appareil/session/presse-papiers, aucun receive de contenu ni capture d’écran. HOME/XDG/bus/audio privés, seule la connexion d’affichage autorisée au compositeur réel.39dépendancesQML/JS et90blobs de source inchangés ; checkout/instance habituels non avancés/rechargés. Revue indépendante des preuves606a0f9a puis09dba92e/b4449195 : objection initiale couverte, notesP2 de classification des warnings et recette de reproduction corrigées/clarifiées, aucun constat restant. Le premier essai n’avait pas affiché de surface : nom synthétiqueIPCshow réservé, erreurCLI109 ; cause démontrée, puis tentative fraîche explicitement autorisée avec fixtureopenPanel etfauxchampmetrics.error corrigés. Aucun correctifQt/compositeur/panneau de production ou changement de runner. **Pas de prétention warning-free :**4messages précis d’indisponibilité attendue des backends privés et21warningsQtWaylandtextinputdisableSurface sont conservés ; l’allowlist exacte rejette tout autreWARN/ERROR/FATAL/CRITICAL, zéro erreur QMLtype/référence/binding/assignment. La navigation/focus native est vérifiée malgré ces transitoires ; aucune correction universelle de textinput revendiquée. Preuves privées : `/tmp/authorized-full-panel-retry.oJzxXYh7/` (18snapshots natifs/états, sources/hashes, logs protocolaires FILTRÉS) ; vérification parent etallowlist dans `/tmp/pi-quickshell-tickets.7b0ahn/`. Ne pas publier les logs Wayland bruts (descriptions matériel). La recette de relecture est l’inspection des fichiers retenus et le nouveau classificateur à sortie séparée ; **ne pas relancer** le driver live ni l’ancienverify-evidence (queries/proc/écritures) sans nouvelle autorisation/revue. Ce dernier reste historique. Le critère « deux écrans, déplacement du panneau, fermeture/réouverture et données absentes » est maintenant accepté sur cette preuve complète. Le code et le gate26/26 au90f0cd8 restent inchangés ; aucune nouvelle mesure de ressources n’a été substituée. - with pi 🥧
mathieu 2026-10-24 19:57:54 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
mathieu/dotfiles#22
No description provided.