Note: this is very much not a good scientific benchmark. Most things I only measured once and I didn't try to control compilation settings. I just cloned the repositories, and ran cargo run -r for an example that seemed fairly minimal to me. I only measured on one machine, on one OS. I still think there is a tiny bit of value in these measurements (hence this gist), but don't take them at face value!
| UI lib/app | size | Final render | window | task bar |
|---|---|---|---|---|
| Slint | 15MB | 111ms | 90ms | 62ms |
| egui | 12MB | 118ms | - | 21ms |
| Freya | 28MB | 146ms | - | 14ms |
| Dioxus Blitz | 37MB | 220ms | - | 70ms |
| Tessera | 11MB | 265ms | - | 0ms |
| Floem | 23MB | 285ms | - | 0ms |
| GPUI | 23MB | 313ms | - | 208ms |
| Dioxus | 9MB | 480ms | 285ms | 258ms |
| Sublime Text | - | 264ms | - | 230ms |
| Zed | - | 413ms | 232ms | 257ms |
Explanation: I measured the time by recording my 144hz screen via OBS. I disabled animations in Gnome. I started the binary via gnome-terminal (via direct path, not cargo run) and then took the time difference between the first frame that the "enter" in the terminal was drawn and other points in time:
- "task bar": when the new window registered in the Gnome task bar
- "window": when the first bit of the window was visible. If it's the same as "final render", it's
-and that's good as there are fewer visual jumps. - "final render": when nothing was changing anymore (some libraries first rendered something incomplete or in the wrong color scheme).
Libraries:
- Slint:
85692d178,todoexample - egui:
28cbd73c5c0,hello_worldexample - Freya: v0.3.4,
buttonexample - Dioxus Blitz: Dioxus with the experimental Blitz backend. I cloned the
blitzrepo,2044d690,flexexample - Tessera: tessera-ui-v2.1.0,
counterexample - Floem:
6148cd8f,counterexample - GPUI: v0.2.0,
hello_worldexample - Dioxus: v0.6.3,
hello_worldexample - Sublime Text: not a library, just as comparison
- Zed: not a library, just as comparison. Zed is using gpui so it's weird that it manages to show a window (albeit not final render) quite a bit earlier than the gpui example.