Profiler for Cairo programming language & Starknet.
You can install cairo-profiler using Starkup, asdf,
or the installation script.
Starkup installs the tools used to develop Cairo packages and Starknet contracts.
Note
On Windows, run Starkup in WSL. Starkup supports macOS and Linux directly.
Run the installer and follow the onscreen instructions:
curl --proto '=https' --tlsv1.2 -sSf https://sh.starkup.sh | shasdf plugin add cairo-profiler
asdf install cairo-profiler latest # Replace 'latest' with a specific version number if neededPlease remember to set global/project version to use:
# in asdf <0.16.0
asdf local cairo-profiler latest
# OR
asdf global cairo-profiler latest
# or in asdf >= 0.16.0
asdf set cairo-profiler latest
# OR
asdf set -u cairo-profiler latestTo install the latest stable version of cairo-profiler, run:
curl -L https://raw.githubusercontent.com/software-mansion/cairo-profiler/main/scripts/install.sh | shIf you want to install a specific a version, run the following command with the requested version:
curl -L https://raw.githubusercontent.com/software-mansion/cairo-profiler/main/scripts/install.sh | sh -s -- v0.1.0As for now, cairo-profiler on Windows needs manual installation, but necessary steps are kept to minimum:
- Download the release archive matching your CPU architecture.
- Extract it to a location where you would like to have
cairo-profilerinstalled. A folder named cairo_profiler in your%LOCALAPPDATA%\Programsdirectory will suffice:
%LOCALAPPDATA%\Programs\cairo_profiler- Add path to the cairo_profiler\bin directory to your PATH environment variable.
- Verify installation by running the following command in new terminal session:
cairo-profiler --versioncairo-profiler is a tool-agnostic profiler which means that it accepts input from any tool. Those tools need to generate
trace in the expected format.
- Starknet Foundry - check how to use it with
cairo-profilerhere - Scarb Execute - check how to use it with
cairo-profilerhere
Usage flow consists of two steps:
- generating the output file
- viewing the generated profile
To generate the file run cairo-profiler with the <PATH_TO_TRACE_DATA> argument containing
the path to the json file with the trace to be profiled. You can also specify the path to the output file via --output-path <OUTPUT_PATH> -
if not specified, the output file will be saved as profile.pb.gz.
cairo-profiler build-profile path/to/trace.jsonor
cairo-profiler path/to/trace.json📝 Note
Trace needs to be in the correct format. See trace.json as an example.
In order to include libfuncs nodes in the output, build profile with --show-libfuncs flag:
cairo-profiler build-profile path/to/trace.json --show-libfuncsYou can use the cairo-profiler to see the results from the generated file. The information will be printed in top
view, closely mimicking pprof output. There are two ways to view the profile:
- by using
viewsubcommand on previously generated profile file - by adding
--viewflag tobuild-profilesubcommand
By default, the top 10 calls samples will be shown. This can be changed using --limit and --sample flags.
If the trace file was generated with snforge 0.49.0+ (with sierra gas tracking enabled), an l2 gas sample will be available.
This measurement includes:
- function and syscall execution resources (i.e. used sierra gas)
- transaction calldata and signatures
- keys and data of emitted events
It does not include:
- constructor calldata (for DEPLOY_ACCOUNT transactions)
- ABI and CASM/Sierra bytecode (for DECLARE transactions)
Viewing directly after building the profile:
cairo-profiler build-profile path/to/trace.json --viewViewing the previously built profile:
cairo-profiler view path/to/profile.pb.gzViewing all the available samples in the profile:
cairo-profiler view path/to/profile.pb.gz --list-samplesViewing the top 2 nodes for "range check builtin" sample:
cairo-profiler view path/to/profile.pb.gz --sample "range check builtin" --limit 2
Showing nodes accounting for 37 range check builtin, 92.50% of 40 range check builtin total
Showing top 2 nodes out of 14
flat | flat% | sum% | cum | cum% |
------------------------+--------+--------+------------------------+---------+-----------------------------------------------------------------------
22 range check builtin | 55.00% | 55.00% | 40 range check builtin | 100.00% | "Contract: SNFORGE_TEST_CODE\nFunction: SNFORGE_TEST_CODE_FUNCTION\n"
15 range check builtin | 37.50% | 92.50% | 15 range check builtin | 37.50% | "CallContract"Viewing the nodes with everything from crate "core" filtered out:
cairo-profiler view path/to/profile.pb.gz --hide "^core::*"Alternatively to see results from the generated file you can also use pprof. To do so, you will need to install:
and run:
go tool pprof -http=":8000" profile.pb.gzThis command will start a web server at the specified port that provides an interactive interface. You can learn more about pprof usage options here.
cairo-profiler is under active development! Expect a lot of new features to appear soon! 🔥
- Starknet calls profiling:
- L2 resources - steps, memory holes, builtins, syscalls
- L1 resources - contract updates, L2 -> L1 messages
- Function level profiling:
- Steps profiling
- Builtins profiling
- Memory holes profiling
- Information about inlined functions
- Integrating with other tools:
- Exposing
cairo-profilerlibrary to allow other tools to integrate - Integrating with
snforge - Integrating with
cairo-testandcairo-run
- Exposing
You need to install: Rust, Go, protoc, pprof and Graphviz.
The binary can be run with:
cargo run <PATH_TO_TRACE_DATA>Tests can be run with:
cargo testcairo-profiler uses rustfmt for formatting. You can run the formatter with:
cargo fmtFor linting, it uses clippy. You can run it using our defined alias:
cargo lintcairo-profiler uses typos for spelling checks.
You can run the checker with
typosSome typos can be automatically fixed by running
typos -w