Rust Performance, CPU & Memory Profiler
Try the TUI demo via SSH - no installation required:
hotpath-rs is an easy-to-configure Rust performance profiling toolkit that shows exactly where your code spends time, burns CPU, and allocates memory.
It helps you distinguish between functions that are slow because they wait on I/O and those that are CPU-intensive. Instrument functions, channels, futures, and streams to find bottlenecks and focus optimizations where they matter most. Get actionable insights into time, memory, and async data flow with minimal setup.
Used by dozens of open-source projects, including:
You can use it to produce one-off performance (timing, memory or CPU) reports:
compare performance between different app versions:
or use the live TUI dashboard to monitor real-time performance and data flow metrics with debug info:
Features
- Time, CPU & memory profiling - identify expensive functions and allocations.
- Async observability - futures, channels and streams.
- Concurrency metrics - Mutex/RwLock wait time and contention.
- Tokio runtime monitoring - workers, scheduling and queues.
- Live TUI dashboard & static reports - real-time or one-off analysis.
- CI regression detection - benchmark every PR automatically.
- MCP server for AI agents - query profiling data in real time.
- Zero cost when disabled - fully feature-gated.
Every Rust pull request gets a performance review.
Catch regressions in memory, SQL queries, HTTP calls and concurrency bottlenecks before they reach production. Iterate on reproducible signals, not CI noise.
Launching soon • Early access invitations will be sent to waitlist members first.
Getting Started
Installation
Add to your Cargo.toml:
[dependencies]
hotpath = "0.17.0"
[features]
hotpath = ["hotpath/hotpath"]
hotpath-cpu = ["hotpath/hotpath-cpu"]
hotpath-alloc = ["hotpath/hotpath-alloc"]
This config ensures that the lib has no compile time or runtime overhead unless explicitly enabled via a hotpath feature. All the lib dependencies are optional (i.e. not compiled) and all macros are noop unless profiling is enabled.
Basic setup
You’ll need only #[hotpath::main] and #[hotpath::measure] macros to get started:
#[hotpath::measure]
fn sync_function(sleep: u64) {
std::thread::sleep(Duration::from_nanos(sleep));
let vec1 = vec![1, 2, 3];
std::hint::black_box(&vec1); // force mem allocation
}
#[hotpath::measure]
async fn async_function(sleep: u64) {
tokio::time::sleep(Duration::from_nanos(sleep)).await;
}
// When using with tokio, place the #[tokio::main] first
#[tokio::main]
#[hotpath::main]
async fn main() {
for i in 0..1000 {
sync_function(i);
async_function(i * 2).await;
hotpath::measure_block!("custom_block", {
std::thread::sleep(Duration::from_nanos(i * 3))
});
}
}
Now, run your program with hotpath (and optionally hotpath-alloc) feature:
cargo run --features='hotpath,hotpath-alloc'
On exit it will print a report with timings, memory allocations and thread usage metrics:
[hotpath] 1.20s | timing, alloc, threads
timing - Function execution time metrics.
+------------------------------+-------+----------+----------+----------+---------+
| Function | Calls | Avg | P95 | Total | % Total |
+------------------------------+-------+----------+----------+----------+---------+
| docs_example::main | 1 | 1.20 s | 1.20 s | 1.20 s | 100.00% |
+------------------------------+-------+----------+----------+----------+---------+
| docs_example::async_function | 1000 | 1.15 ms | 1.20 ms | 1.15 s | 96.10% |
+------------------------------+-------+----------+----------+----------+---------+
| custom_block | 1000 | 18.13 µs | 31.71 µs | 18.13 ms | 1.51% |
+------------------------------+-------+----------+----------+----------+---------+
| docs_example::sync_function | 1000 | 16.58 µs | 27.63 µs | 16.58 ms | 1.38% |
+------------------------------+-------+----------+----------+----------+---------+
alloc - Cumulative allocations during each function call (including nested calls).
+------------------------------+-------+---------+---------+---------+---------+
| Function | Calls | Avg | P95 | Total | % Total |
+------------------------------+-------+---------+---------+---------+---------+
| docs_example::main | 1 | 63.0 KB | 63.1 KB | 63.0 KB | 100.00% |
+------------------------------+-------+---------+---------+---------+---------+
| docs_example::sync_function | 1000 | 12 B | 12 B | 11.7 KB | 18.58% |
+------------------------------+-------+---------+---------+---------+---------+
| custom_block | 1000 | 0 B | 0 B | 0 B | 0.00% |
+------------------------------+-------+---------+---------+---------+---------+
| docs_example::async_function | 1000 | 0 B | 0 B | 0 B | 0.00% |
+------------------------------+-------+---------+---------+---------+---------+
threads - Thread CPU and memory statistics. (RSS: 7.8 MB, Alloc: 2.1 MB, Dealloc: 304.3 KB, Diff: 1.8 MB, 5/10)
+--------------+----------+------+------+----------+---------+-----------+----------+----------+----------+
| Thread | Status | CPU% | Max% | CPU User | CPU Sys | CPU Total | Alloc | Dealloc | Diff |
+--------------+----------+------+------+----------+---------+-----------+----------+----------+----------+
| hp-functions | Sleeping | 1.8% | 1.8% | 0.018s | 0.001s | 0.019s | 1.8 MB | 291.3 KB | 1.5 MB |
+--------------+----------+------+------+----------+---------+-----------+----------+----------+----------+
| main | Sleeping | 6.3% | 6.3% | 0.123s | 0.070s | 0.193s | 367.8 KB | 9.9 KB | 357.9 KB |
+--------------+----------+------+------+----------+---------+-----------+----------+----------+----------+
| hp-threads | Running | 0.0% | 0.0% | 0.000s | 0.001s | 0.001s | 10.3 KB | 3.0 KB | 7.3 KB |
+--------------+----------+------+------+----------+---------+-----------+----------+----------+----------+
| hp-server | Sleeping | 0.0% | 0.0% | 0.000s | 0.001s | 0.001s | 1.8 KB | 56 B | 1.7 KB |
+--------------+----------+------+------+----------+---------+-----------+----------+----------+----------+
| thread_5 | Sleeping | - | - | 0.000s | 0.000s | 0.000s | 640 B | 24 B | 616 B |
+--------------+----------+------+------+----------+---------+-----------+----------+----------+----------+
Quick demo
Other than the SSH demo an easy way to quickly try the ratatui.rs-powered TUI is to run it in auto-instrumentation mode. The TUI process profiles itself and displays its own performance metrics in real time.
First, install hotpath CLI with auto-instrumentation enabled:
cargo install hotpath --features='tui,hotpath,hotpath-alloc' --version '^0.17.0'
Then launch the TUI:
hotpath
and you’ll see timing, memory and other metrics.
Make sure to reinstall it without the auto-profiling features so that you can also observe metrics of other programs!
cargo install hotpath --features='tui' --version '^0.17.0'
Learn more
Explore the docs for customization options and advanced profiling features.
- Sampling Comparison - when to use
hotpathvs CPU sampling profilers - Profiling modes - static reports vs live TUI dashboard
- Functions - measure execution time and memory allocations
- CPU profiling - attribute CPU samples to instrumented functions
- A/B Benchmarks - compare performance between app versions
- Async Data Flow - monitor channels, streams, and futures
- Debug & Metrics - track custom values with dbg!, val!, and gauge! macros
- Threads - monitor threads usage
- Tokio Runtime - monitor Tokio runtime worker stats and task scheduling
- MCP Server - LLM integration via Model Context Protocol
- GitHub CI - automated benchmarking and regression detection in CI
- Configuration - explore all config options