L’ingénierie UI à l’heure de l’IA
Avant l’IA, le Web multiplateforme apportait une bonne réponse. Écrire du code coûte désormais moins cher, mais le vérifier reste coûteux. Les UI sur GPU et la génération d’applications natives pour chaque plateforme ont toutes deux une carte à jouer. Nous avons testé 10 frameworks.
OriginalReproduction interdite sans autorisation

Le 12/12/2025, mikayla-maki, ingénieure chez Zed, a fermé une PR proposant des shaders personnalisés pour GPUI. La réponse était courtoise. Après avoir remercié l’auteur, elle expliquait : “we’re shifting focus to core product work at Zed, and without a Zed use case, I can’t validate this code”. Le message se terminait par un sourire.
GPUI est le framework d’interface GPU développé par Zed. Il revient souvent parmi les alternatives à Electron. Moins de quatre mois auparavant, Zed avait annoncé une levée de 32,000,000 de dollars menée par Sequoia, portant son financement total au-delà de 42,000,000 de dollars.
Plus de neuf mois après, le 26/9/2026, le développeur egoist a créé un dépôt nommé MyGo. Après 39 jours, il comptait 1,042 commits, dont 890 portant la signature de Claude.
Claude vient d’Anthropic. L’application de bureau d’Anthropic utilise elle-même Electron.
Ces trois faits, réunis, ont quelque chose d’étrange. Nous avons mesuré 10 frameworks sur deux machines pour voir où en est ce domaine.
01Pourquoi ce comparatif
Des applications de bureau comme Claude et Codex utilisent toujours Electron : l’écosystème Web est mature, une même base de code couvre plusieurs plateformes et les modèles le connaissent bien. L’IA réduit le coût du développement, mais la compatibilité et la maintenance multiplateformes demandent toujours du travail.
Le rendu propre sur GPU offre une autre voie, mais GPUI donne toujours la priorité à Zed. Le rendu multiplateforme et un écosystème de composants exigent un investissement durable. MyGo montre comment l’IA et les composants existants accélèrent les débuts ; sa maturité en production et sa maintenance à long terme restent à démontrer.
Flutter, Compose, Slint, egui et iced font des compromis différents. Nous avons testé 10 frameworks avec les mêmes scénarios, en mesurant la fluidité, le CPU, la mémoire et la fidélité visuelle pour connaître le coût réel de chaque approche.
02Nous avons testé en local
Nous avons testé 10 frameworks avec les mêmes scénarios sur un Apple M4 Max et un ThinkPad T14 Gen6. Le CPU et la mémoire ont été mesurés sur les deux plateformes ; Windows dispose aussi de mesures externes des images avec PresentMon. Sur Mac, les callbacks d’image diffèrent selon les frameworks et ne servent pas à les comparer. Le matériel et les indicateurs mémoire diffèrent également : les comparaisons restent donc propres à chaque plateforme.
La scène d’animation est dense : 500 cartes de 96×64 pixels logiques se chevauchent sur 25 colonnes. Chacune possède un rayon de coin de 12, un dégradé à 135° et une ombre de blur 16 décalée de 4 vers le bas. Leurs positions sont mises à jour à chaque image selon un cercle de rayon 12 et de période 4 secondes. Nous présentons la médiane de cinq essais de 30 secondes.
Nous mesurons surtout le coût CPU de la mise à jour de l’interface, de la préparation du dessin et de la soumission du rendu lorsque de nombreux éléments avec effets bougent continuellement, ainsi que la régularité des images. Le CPU couvre l’arbre des processus de l’application, pas l’utilisation du GPU ni le temps par étape. Il faut le lire avec les intervalles entre images : produire moins d’images peut aussi réduire le CPU. Les 500 cartes sont présentes dans la scène ; le chevauchement et le découpage de la fenêtre empêchent leur dessin intégral à chaque image.
Windows
| Framework | Liste : intervalle | Anim. : intervalle | CPU flux | CPU édition | CPU anim. | RAM anim. |
|---|---|---|---|---|---|---|
| WPF (natif) | 8.6 | 684 | 73% | 13% | 49% | 2,425 |
| Electron | 8.8 | 108 | 31% | 92% | 138% | 947 |
| Tauri | Invalide | 92 | 54% | 105% | 148% | 913 |
| GPUI | 8.6 | 16.7 | 24% | 4% | 22% | 142 |
| MyGo | 8.4 | 8.6 | 11% | 6% | 33% | 115 |
| egui | 8.8 | 8.5 | 12% | 20% | 49% | 388 |
| iced | 8.9 | 8.5 | 20% | 3% | 25% | 215 |
| Slint | 8.5 | 8.5 | 27% | 99% | 67% | 61 |
| Flutter | 8.4 | 80 | 22% | 105% | 91% | 4,934 |
| Compose | 8.8 | 160 | 34% | 106% | 102% | 2,422 |
Tous suivent le défilement de liste. L’écart apparaît avec l’animation : pour 500 cartes avec ombres et dégradés, les frameworks à rendu propre en Rust et Go tiennent globalement les 120Hz. Flutter, Electron, Tauri et Compose atteignent des intervalles de 80 à 160ms. Les 684ms de WPF viennent de 500 effets d’ombre indépendants. Sans eux, il revient à 8.3ms : ce n’est donc pas un problème général.
L’édition de texte est un autre obstacle. Avec 10 caractères insérés par seconde dans un document de 5,000 lignes, Flutter, Compose et Slint saturent un cœur. Sous Windows, Flutter perd aussi trente pour cent des entrées.
Mac
| Framework | CPU flux | CPU édition | CPU anim. | Mémoire liste | RAM anim. |
|---|---|---|---|---|---|
| SwiftUI | 87.5% | 8.9% | 99.1% | 40 | 37 |
| Electron | 16.1% | 62.0% | 102.2% | 536 | 698 |
| Tauri | 42.1% | 86.9% | 78.7% | 753 | 555 |
| GPUI | 22.5% | 2.9% | 17.0% | 341 | 335 |
| MyGo | 8.2% | 2.8% | 16.3% | 368 | 371 |
| egui | 8.6% | 7.2% | 20.4% | 803 | 839 |
| iced | 18.2% | 7.5% | 15.0% | 489 | 491 |
| Slint | 18.4% | 52.1% | 26.7% | 423 | 416 |
| Flutter | 18.3% | 101.9% | 237.4% | 468 | 994 |
| Compose | 31.3% | 105.1% | 107.5% | 710 | 1,295 |
Sur Mac, le CPU d’animation atteignait environ 15%–20% pour GPUI, MyGo, egui et iced, contre 237% pour Flutter et autour de 100% pour Electron et Compose. En édition de texte, Flutter et Compose approchaient toujours un cœur complet. Slint était à 52%, contre 99% sous Windows.
Pour la liste, les quelque 40 MiB de SwiftUI, 340 MiB de GPUI et 800 MiB d’egui décrivent avant tout l’empreinte des processus de l’application. Une UI native peut utiliser des services de rendu système externes : Apple indique qu’AppKit préfère rendre les arbres de calques hors processus. Une partie du dessin et de la composition se fait donc ailleurs. Les moteurs personnalisés utilisent aussi la composition système, mais leurs seuls chiffres de processus ne permettent pas de comparer la répartition du travail. La mémoire unifiée des puces M partage la mémoire physique entre CPU et GPU ; elle n’impute pas tous les coûts au phys_footprint de l’application.
Dans cinq courtes traces GPU par scène de liste et d’animation SwiftUI, aucun événement d’exécution GPU du PID de l’application n’a été observé, tandis que WindowServer était actif. Cela ne signifie ni que SwiftUI n’utilise pas le GPU, ni que toute l’activité du bureau lui revient. La référence mémoire de WindowServer fluctuait d’environ 205 MiB ; l’absence de gros objets partagés dans les instantanés n’exclut pas non plus la réutilisation de ressources système existantes. Ces mesures établissent seulement une empreinte de processus plus faible pour SwiftUI, pas un coût global de rendu inférieur ni une prise en charge intégrale de l’écart par le système.
Ces chiffres ne valent que pour ces deux machines, ces versions et nos programmes de test. La méthode et les données complètes figurent à la section 05.
03Il n’a jamais fallu n’en choisir qu’un
Les éditeurs, outils de développement et applications métier ont des besoins différents en saisie de texte, animation, mémoire, livraison multiplateforme et composants. Chacun a ses usages. Choisir un framework revient à décider quels compromis sont acceptables.
De nombreux frameworks utilisent aussi la rétention, le cache et les mises à jour partielles pour éviter de répéter la mise en page et le dessin. GPUI combine les modes immédiat et retenu. Le modèle d’interface, le travail réutilisable et le temps nécessaire pour dessiner une image sont des questions distinctes.
MyGo, iced, GPUI, Slint et egui suivent tous le rythme des animations, avec une faible utilisation du CPU. Slint utilise le moins de mémoire, egui en consomme plutôt beaucoup et les contrôles d’édition de GPUI sont à fournir soi-même. MyGo sert actuellement surtout aux applications de son auteur et n’a pas encore été validé à grande échelle en production.
Flutter, Electron et Compose ont également présenté des intervalles entre images et une consommation de ressources peu satisfaisants dans ce test de charge d’animation. Le paquet de Tauri ne pèse que 11 MB, mais sa consommation de mémoire à l’exécution est proche de celle d’Electron.
04Le blocage est dans la vérification
Nous pensons maintenant que la vérification compte plus que le rendu.
Écrire du code coûte moins cher, mais vérifier qu’il est correct prend toujours du temps. Dans l’enquête développeurs Stack Overflow 2025, 66% avaient rencontré des solutions d’IA “almost right, but not quite”, et 45.2% déclaraient passer plus de temps à déboguer le code de l’IA. Selon une enquête publiée par Sonar en 01/2026, 96% ne faisaient pas entièrement confiance à la correction fonctionnelle du code généré, et seulement 48% disaient toujours le vérifier avant un commit. Sonar vend des outils d’inspection de code : ses chiffres appellent une certaine prudence, mais rejoignent ceux de la première enquête.
Les publications de Slint et egui ont peu fait parler d’elles. Nous les jugeons plus importantes que les progrès du rendu. Un agent doit pouvoir injecter des entrées et prendre des captures pour modifier, regarder, puis corriger à nouveau. Avant, vérifier une interface demandait à quelqu’un de s’asseoir devant la machine et de cliquer partout. Les machines commencent à pouvoir s’en charger.
Il existe aujourd’hui trois façons de faire. Le Web multiplateforme possède le plus d’acquis. Le rendu propre sur GPU évite d’embarquer un navigateur et sa mise en place est plus accessible qu’avant. Le natif sur chaque plateforme est la méthode la plus ancienne. Autrefois, seules les grandes entreprises pouvaient financer plusieurs équipes. La difficulté actuelle, ce sont les bugs et le périmètre d’assistance triplés décrits par Breunig. Si la vérification coûte moins cher et que la qualité s’améliore, générer directement une application native par plateforme pourrait aussi fonctionner.
Nous explorons aussi notre propre GPU UI. La différence consiste à y apporter une grande partie de la DX du Web : composants proches de JSX, styles proches de CSS, disposition flexbox, état réactif et DevTools semblables à ceux du navigateur, le tout compilé en code natif. Le projet en est encore à ses débuts.
Nous ne savons pas quelle réponse gagnera. Plusieurs pourraient coexister longtemps. Les trois faits du début restent inchangés. La PR est toujours fermée, MyGo grandit et l’application de bureau Claude reste sur Electron. C’est une période très intéressante.
05Rapport expérimental
Les essais ont eu lieu du 4 au 6 novembre 2026. Les mêmes scénarios ont été réalisés pour chaque framework avec les pratiques recommandées, les paramètres par défaut et des versions compilées pour la production. Après correction du flou, nous avons remesuré la page de design de Compose et le scénario au repos qui partage son implémentation.
| Élément | Mac | Windows |
|---|---|---|
| Machine | Apple M4 Max, 16 cœurs, 64 GB | ThinkPad T14 Gen6, Core Ultra 7 255H, GPU intégré Arc 140T, 32 GB |
| Système | macOS 26.4 | Windows 11 Pro 10.0.26300 |
| Écran | Studio Display,60Hz,2x | 2880×1800,120Hz,200% |
| Fenêtre | 1440×900 pixels logiques | 1280×720 pixels logiques ; page de design 1440×900 sans bordure |
| Métrique mémoire | phys_footprint | private commit (mémoire privée engagée, pas l’occupation physique) |
| Métrique images | Callbacks de l’application ; sens différent selon le framework, exclus des comparaisons | Intervalle d’affichage PresentMon 2.6.0, mesure externe |
| État de la machine | Non au repos ; autres tâches de développement pendant les tests | Aucune autre action utilisateur |
| Framework | Version | Rendu Mac | Rendu Windows |
|---|---|---|---|
| SwiftUI / WPF | macOS 26.4 SDK / .NET Framework 4.8.1 | Composition système | Pipeline D3D9 par défaut de WPF |
| Electron | 45.2.2 | Non vérifié | Chromium,ANGLE D3D11 |
| Tauri | 2.12.5 | WKWebView | WebView2 156,ANGLE D3D11 |
| GPUI | Zed c4273271 | Metal, réglages par défaut | Non vérifié |
| MyGo | 86ec3b30 | Non vérifié | Non vérifié |
| egui | eframe 0.37.0 | Metal | Vulkan |
| iced | 0.14.0 | Metal | Vulkan |
| Slint | 1.18.1 | FemtoVG,OpenGL | FemtoVG,OpenGL ES |
| Flutter | 3.47.9 | Impeller,Metal | Impeller,ANGLE D3D11 |
| Compose | 1.12.2 | Skiko,Metal | Skiko,D3D12 |
| Scénario | Travail effectué |
|---|---|
| Repos | Afficher la page de design sans la modifier pour mesurer le coût au repos |
| Liste | Liste virtualisée de 10,000 lignes, hauteur 64, défilement constant à 2,000 px/s |
| Flux | Charger 200 anciens messages, puis ajouter 40 mots par seconde au dernier, toujours en bas |
| Édition | Document de 5,000 lignes, insertion de 10 caractères par seconde au curseur |
| Animation | 500 cartes de 96×64, rayon 12, dégradé et ombre, mouvement circulaire selon une formule commune |
| Page de design | 11 spécifications : polices, ombres, traits fins, dégradés, P3, flou d’arrière-plan, coins arrondis, emoji, OpenType, composition mixte chinois-anglais |
Chaque scénario a été exécuté 5 fois par framework, 30 secondes par passage, en série et dans un ordre mélangé. Les tableaux donnent les médianes. La médiane des étendues entre les 5 passages était d’environ 3% ; neuf dixièmes restaient sous 24%. Liste et animation ont été remesurées après harmonisation des spécifications : les colonnes ne viennent donc pas de la même période. Un cœur logique vaut 100% de CPU. Les applications multiprocessus incluent tous leurs processus enfants. Pour Tauri sur Mac, nous avons aussi compté les processus WebKit lancés pour lui par le système. Sur Windows, seules les séries attribuables sans ambiguïté à un swapchain et sans perte d’enregistrements sont retenues pour les images.
Nous avons vérifié le travail effectivement livré pour le flux et l’édition : sur Windows, Flutter n’a terminé que 68% de l’édition ; tous les autres dépassaient 99%.
| Framework | Repos | Liste | Flux | Édition | Animation |
|---|---|---|---|---|---|
| WPF | 2.6 | 37.2 | 72.7 | 13.5 | 49.3 |
| Electron | 6.1 | 42.8 | 30.6 | 92.1 | 137.8 |
| Tauri | 31.6 | 58.2 | 53.7 | 104.9 | 147.8 |
| GPUI | 1.5 | 10.6 | 24.3 | 3.6 | 21.5 |
| MyGo | 0.0 | 17.9 | 10.6 | 6.3 | 32.8 |
| egui | 0.3 | 15.9 | 12.2 | 19.6 | 48.9 |
| iced | 0.3 | 21.3 | 20.2 | 3.0 | 24.5 |
| Slint | 0.3 | 62.7 | 26.9 | 99.1 | 66.8 |
| Flutter | 0.6 | 31.2 | 21.8 | 104.6 | 90.6 |
| Compose | 0.5 | 35.9 | 34.4 | 106.4 | 101.8 |
| Framework | Repos | Liste | Flux | Édition | Animation |
|---|---|---|---|---|---|
| WPF | 157 | 193 | 250 | 206 | 2,425 |
| Electron | 280 | 397 | 392 | 556 | 947 |
| Tauri | 260 | 313 | 346 | 536 | 913 |
| GPUI | 135 | 142 | 160 | 138 | 142 |
| MyGo | 132 | 135 | 133 | 132 | 115 |
| egui | 379 | 386 | 396 | 460 | 388 |
| iced | 212 | 224 | 274 | 321 | 215 |
| Slint | 79 | 87 | 72 | 202 | 61 |
| Flutter | 636 | 396 | 374 | 667 | 4,934 |
| Compose | 421 | 544 | 574 | 3,372 | 2,422 |
| Framework | Liste p95 | Liste p99 | Passages | Anim. p95 | Anim. p99 | Passages |
|---|---|---|---|---|---|---|
| WPF | 8.6 | 8.7 | 5 | 684.3 | 719.3 | 5 |
| Electron | 8.8 | 8.9 | 4 | 108.3 | 115.9 | 2 |
| Tauri | — | — | 0 | 91.7 | 100.0 | 5 |
| GPUI | 8.6 | 8.8 | 5 | 16.7 | 25.1 | 5 |
| MyGo | 8.4 | 8.7 | 5 | 8.6 | 16.7 | 5 |
| egui | 8.8 | 8.9 | 5 | 8.5 | 8.7 | 5 |
| iced | 8.9 | 8.9 | 5 | 8.5 | 8.6 | 5 |
| Slint | 8.5 | 8.8 | 5 | 8.5 | 8.7 | 5 |
| Flutter | 8.4 | 8.6 | 5 | 80.5 | 88.6 | 5 |
| Compose | 8.8 | 8.9 | 5 | 160.3 | 211.8 | 5 |
| Framework | Repos | Liste | Flux | Édition | Animation |
|---|---|---|---|---|---|
| SwiftUI | 1.0 | 16.9 | 87.5 | 8.9 | 99.1 |
| Electron | 2.5 | 16.7 | 16.1 | 62.0 | 102.2 |
| Tauri | 6.3 | 32.0 | 42.1 | 86.9 | 78.7 |
| GPUI | 0.4 | 9.7 | 22.5 | 2.9 | 17.0 |
| MyGo | 0.1 | 13.2 | 8.2 | 2.8 | 16.3 |
| egui | 0.1 | 9.0 | 8.6 | 7.2 | 20.4 |
| iced | 0.1 | 24.2 | 18.2 | 7.5 | 15.0 |
| Slint | 0.1 | 13.1 | 18.4 | 52.1 | 26.7 |
| Flutter | 0.2 | 11.0 | 18.3 | 101.9 | 237.4 |
| Compose | 0.4 | 23.3 | 31.3 | 105.1 | 107.5 |
| Framework | Repos | Liste | Flux | Édition | Animation |
|---|---|---|---|---|---|
| SwiftUI | 32 | 40 | 136 | 293 | 37 |
| Electron | 205 | 536 | 567 | 707 | 698 |
| Tauri | 101 | 753 | 601 | 570 | 555 |
| GPUI | 74 | 341 | 358 | 320 | 335 |
| MyGo | 75 | 368 | 361 | 356 | 371 |
| egui | 414 | 803 | 817 | 862 | 839 |
| iced | 75 | 489 | 541 | 598 | 491 |
| Slint | 151 | 423 | 386 | 434 | 416 |
| Flutter | 156 | 468 | 455 | 663 | 994 |
| Compose | 350 | 710 | 709 | 1,426 | 1,295 |
| Framework | Démarrage Mac | Démarrage Windows | Taille Mac | Taille Windows |
|---|---|---|---|---|
| Natif (SwiftUI / WPF) | 228 | 449 | 3.0 | <0.1 |
| Electron | 295 | 818 | 267.0 | 376.4 |
| Tauri | 565 | 622 | 12.5 | 11.2 |
| GPUI | 255 | 277 | 11.9 | 13.4 |
| MyGo | 742 | 126 | 13.1 | 11.5 |
| egui | 309 | 277 | 17.4 | 17.4 |
| iced | 257 | 590 | 14.4 | 14.2 |
| Slint | 261 | 272 | 18.5 | 17.0 |
| Flutter | 244 | 1,043 | 43.9 | 30.0 |
| Compose | 550 | 1,074 | 123.1 | 113.8 |
Fidélité au design
Le test de flou consiste à adoucir les transitions entre les bandes colorées dans un panneau précis de la fenêtre. Avec Modifier.blur réglé à 24 dp sur la couche de bandes dans Compose 1.12.2, les captures des fenêtres natives sur Mac et Windows montrent des transitions douces. SwiftUI applique lui aussi le flou à la couche de bandes connue avant de la recouvrir de blanc translucide. Les deux vérifications portent sur cette couche précise. API Compose Desktop
Les implémentations testées de GPUI, iced, egui et Slint superposent une couche translucide aux bandes. Les frontières entre les couleurs restent nettes lors du nouvel essai. Blurred dans GPUI et window::Settings::blur dans iced agissent sur le contenu derrière la fenêtre. Nous n’avons trouvé aucune API de dessin intégrée pour le flou d’arrière-plan local dans les versions testées. iced permet de dessiner des effets locaux sur mesure, et egui peut appeler le moteur de rendu via PaintCallback. GPUI · Paramètres de fenêtre d’iced · Callback de dessin d’egui
Slint a été testé avec la version 1.18.1 et FemtoVG. Cette version ne proposait pas la propriété d’élément backdrop-blur. Le projet l’a ensuite ajoutée pour le moteur Skia. Les captures correspondent au rendu FemtoVG de la version 1.18.1. Ticket du projet Slint
La page comporte 11 vérifications. GPUI, egui, iced, Slint et Compose n’ont pas reproduit l’échantillon P3 dans la sortie Mac testée. Les captures Windows n’ont pas de profil couleur : P3 n’est pas évalué et les drapeaux emoji apparaissent sous forme de lettres.
| Framework | Disposition | Texte | Accessibilité |
|---|---|---|---|
| GPUI | Taffy | CoreText sur macOS | AccessKit |
| egui | Disposition en mode immédiat | epaint + harfrust | AccessKit |
| iced | Disposition flex propre | cosmic-text | Aucun pont système trouvé |
| Slint | Lowering à la compilation + disposition à l’exécution | Parley | AccessKit |
| Flutter | Contraintes RenderBox | SkParagraph | Pont de l’arbre Semantics |
| Compose | MeasurePolicy | SkParagraph de Skiko | Semantics ; Java Access Bridge requis sous Windows |
| Electron | Blink | Pipeline texte Chromium | Arbre d’accessibilité Chromium |
| Tauri | WebView système | WebView système | Exposé par WebView |
| SwiftUI | Stack / Layout | TextKit,Core Text | Intégré au système |
La disposition converge ; le texte reste la principale divergence. Quand iced demande PingFang 700 sur macOS, les lettres latines se rabattent sur Menlo Bold.
Limites :
- Une seule machine par plateforme. Les résultats d’animation viennent d’un GPU intégré Intel et ne s’appliquent pas forcément aux GPU dédiés.
- Le Mac n’était pas au repos pendant les tests. Les données d’images viennent uniquement des callbacks de l’application et ne servent pas à comparer les frameworks.
- La sémantique du blur des ombres varie. egui, iced et GPUI en donnent une approximation. Les contrôles d’édition ne sont pas équivalents non plus ; GPUI utilise un éditeur d’exemple modifié.
- Les tableaux CPU et mémoire couvrent l’application et les processus auxiliaires inclus. Les coûts de WindowServer et du pilote ne sont pas répartis par fenêtre, et les gains de réutilisation des ressources système partagées ne sont pas quantifiés ; aucun classement du coût global de rendu n’en découle.
- Les mesures des fenêtres de candidats des méthodes de saisie, de l’arbre d’accessibilité sur Mac et de la consommation électrique n’ont pas donné de résultats exploitables.

