Tauri vs Iced vs egui: Rust GUI framework performance comparison (including startup time, input lag, resize tests)
Recently I found myself in need of doing GUI with Rust, so I researched and experimented a bit. In this post, I want to share the data I collected, as it might help others. I will mostly compare Tauri, Iced and egui as those seem to be popular choices. I spent quite a bit of time performing tests to assess the speed/performance of these libraries, as a snappy UI experience is something I really value.
🔑 Key takeaways
- All three are likely fast enough for most cases.
- Tauri falls slightly behind Iced and egui in terms of startup time and resize performance (on my machine).
Note: This is by no means a full comparison! There are certainly important aspects that are not mentioned in this post. Also be sure to read the disclaimer regarding my performance tests! If you find any factual error, please let me know so that I can fix the post :)
Quick introduction
- Tauri: Uses the webview by the OS to render an HTML/JS frontend. You can chose any frontend framework (JS or Rust). “Backend” is written in Rust, can communicate with frontend via built-in methods.
- Iced: Elm-inspired (reactive) GUI library. Uses wgpu for rendering on desktop; experimental web backend to create DOM for rendering. All code in Rust.
- egui: Immediate mode GUI using OpenGL for custom rendering. All code in Rust.
Comparison
Statistics | Tauri | Iced | egui |
---|---|---|---|
GitHub | 60k★, used by 10k | 18k★, used by 2k | 13k★, used by 6k |
crates.io downloads (recent/all-time) | 145k / 485k | 30k / 180k | 135k / 600k |
Architecture & Implementation | Tauri | Iced | egui |
Programming model | Depends on chosen frontend-framework | Elm-like/reactive | Immediate mode |
Desktop | 🟢 via OS webview | 🟢 wgpu-based | 🟢 backend-agnostic, default backend is OpenGL-based |
Web | 🟡 not built-in, manual setup possible | 🟠 experimental, via iced_web |
🔴 via WebGL† |
Subjective Ratings | Tauri | Iced | egui |
Stability/Maturity | 🟢 1.0, big community, has sponsors, multiple devs, has Governance page | 🟠 0.7, "experimental", active development since 2019, used a lot | 🟠 0.20, “in active development”, “interfaces in flux”, “lacks features”, active development since 2019, mainly one dev, used a lot |
Documentation | Fairly good; lots of templates; could use more guide-level docs for backend; crate docs could be better | Good crate docs, but lacking guide-level docs; "book" basically non-existent; many examples | Good crate docs; many examples |
DX | 🟢 Frontend instant reload; browser dev tools; good CLI tools | 🟠 Always recompile; debug overlay with performance metrics | 🟠 Always recompile |
Performance on my machine
(see disclaimer below!)
|
Tauri | Iced | egui |
Startup time | ≈380ms (window after ≈125ms) | ≈230ms (window after ≈33ms) | ≈280ms |
Input delay (frame = 16ms) | 2–3 frames | 3 frames | 2 frames |
Resize | 🟠 10–15fps | 🟡 12-30fps | 🟡 12-30fps |
Binary size | 5MB | 17MB | 18MB |
† Using a canvas-based renderer on the web is not optimal for a number of reasons (not being able to ctrl+f, inputs being weird, …). See here for more information.
Performance
Important disclaimer
Everything was measured on my Ubuntu 20.04, Gnome 3.36.8, X11, Nvidia proprietary drivers, without animations (disabled in Gnome Tweaks), 60Hz monitor. I hardly changed any desktop/Gnome configuration, but still: the setup could be borked for any number of reasons (#linux). The fact that moving windows around was not always 60fps is already an indicator that something is wrong.
Do not interpret these performance metrics as a universal statement about these GUI libraries. I have not even tested Windows or macOS, which could behave wildly different.
Methodology
All of these measurements were taken by recording the full screen with OBS, then counting frames in Avidemux. Programs used:
- Tauri:
helloworld
example at7e8e0e76ec
. - Iced:
todos
example at98a717383a
(yes, I should have used “hello world”, too, but I don’t think it makes a difference in this case). - egui:
hello_world
example at5725868b57
. - Sublime Text Build 4143 with a project and many tabs open.
- VS Code 1.74.3 with home directory opened in the side browser, but hardly any tabs.
- xclock
The first three I compiled myself with cargo build --release
.
The last three I included for comparison.
I mainly use Sublime Text, an editor using a custom UI framework, which is often praised for its snappy UI.
VSCode is a very popular editor that uses Electron, which is often criticized for being slow and sluggish.
I figured xclock
is a super low level UI application, without any framework, using X calls directly.
And yes, I realize this is not a fair comparison for Sublime Text and VSCode, as they are useful programs with lots of data loaded, instead of minimal examples. I still think the comparison is useful.
Startup time
Binaries were directly started from the terminal (no cargo
or npm
used).
I counted the frames from the moment my “Enter” press was drawn by the terminal until the window appears/the final UI is rendered.
This is not an exact measurement of the absolute perceived startup time, but it’s useful for a relative comparison.
Numbers are in ms, one number per test/trials.
Final render | Window appears | Visual jumps | Behavior of window contents | |
---|---|---|---|---|
Tauri | 366, 417, 400 | 100, 134, 150 | 1 | First grey, then final UI |
Iced | 333, 217, 266, 217, 217 | 33, 33, 33, 33, 50 | 1 | First black, then final UI |
egui | 300, 200, 283, 300, 250 | 🠔 | 0 | Final UI from the start |
xclock | 66, 100, 84 | 🠔 | 0 | Final UI from the start |
Sublime | 450, 450, 467 | 🠔 | 0 | Final UI from the start |
VSCode | 1450, 1250, 1450 | 500, 484, 517 | 4 | First grey, after 180ms blue, one frame later three color areas (roughly resembling the layout), roughly 400ms later almost final UI, 130ms later icons are drawn |
Resizing
App was horizontally resized (changing its width). FPS was determined by looking at the recording and counting frames between changes. By “decorations” I mean the window title bar with close buttons and the like.
Resize FPS | Behavior | |
---|---|---|
Tauri | ≈10–15 fps | UI lags behind window |
Iced | ≈12–30 | UI in sync with window. Funnily, decorations lag behind |
egui | ≈12–30 | UI in sync with window |
xclock | ≈20–30 | UI in sync with window |
Sublime | ≈20–30 | UI in sync with window |
VSCode | ≈8–12 | UI lags behind window (sometimes black replacement, sometimes blue) |
Input lag
For each application I pick an element that changes color on hover. I count how many frames the cursor is over said element without the element changing color. The cursor is also recorded by OBS: I don’t know how exact this is, but the cursor sometimes seemed to lag/skip a frame in the recording. So take this, as everything else, with a grain of salt.
Input lag in frames (each tested multiple times):
- Tauri: 3, 2, 2, 3, 3, 3, 3
- Iced: 3, 3, 3, 3, 3, 3, 3
- egui: 2, 2, 2, 2, 2, 2
- Sublime: 2, 2, 2, 3, 2
- VSCode: 3, 4, 6, 3, 3, 6
Scrolling smoothness
I checked Tauri, Sublime Text, and VSCode and all three scroll with 30–60fps. Sublime hits the 60fps more often than the other two, but also skips a frame from time to time.
Discuss on Reddit.