canbench is a tool for benchmarking canisters on the Internet Computer.
Canister smart contracts on the Internet Computer consume compute and memory resources.
Since resources are finite, execution of a message (transaction) must remain within specific bounds:
- Instructions: A monotonically increasing counter correlated with compute and memory usage.
- Dirty Pages: The number of memory pages written to.
If a message exceeds these limits, it is aborted.
canbench gives developers insights into how their code consumes instructions and memory.
Support for reporting dirty pages will be added once the IC exposes that information.
- Analyze instruction, heap, and stable memory usage of canisters
- Detect performance regressions in local or CI environments
- Identify potential performance bottlenecks
- 
Relevant metrics Traditional benchmarking tools rely on repeated runs and averaging time. 
 On the deterministic Internet Computer, this is neither necessary nor insightful.
 canbenchreports instruction count and memory changes directly.
- 
Regression detection Persist benchmark results in your repo. 
 canbenchcompares results over time to highlight performance regressions.
- 
High instruction limits While regular messages are capped at a few billion instructions, canbenchsupports up to 10 trillion, allowing deep benchmarking.
- 
Language-agnostic While currently Rust-focused, canbenchis designed to support canisters written in any language.
cargo install canbenchSee the crate's documentation.
You can integrate canbench into your GitHub CI pipeline to catch regressions automatically.
You’ll need:
- 
Benchmark scripts (see scripts/directory)
- 
A workflow that posts benchmarking results as PR comments ( canbench-post-comment.yml)
- 
A job to upload the PR number (see upload-pr-numberinci.yml)
- 
The benchmark job itself (e.g. benchmark-fibonacci-exampleinci.yml)
Once configured, the job will fail on regressions and pass otherwise. It will also leave a PR comment with detailed results. See this PR example.