#profiling #compiler-plugin #flame-graph


a procedural macro to insert flame::start_guard(_) calls

11 releases

0.3.0 Nov 6, 2018
0.2.5 Jul 13, 2018
0.2.3 Jun 24, 2018
0.2.0 Jan 8, 2018
0.1.2 Jul 8, 2016

#8 in Profiling

Download history 130/week @ 2019-01-19 231/week @ 2019-01-26 85/week @ 2019-02-02 189/week @ 2019-02-09 66/week @ 2019-02-16 142/week @ 2019-02-23 119/week @ 2019-03-02 64/week @ 2019-03-09 63/week @ 2019-03-16 297/week @ 2019-03-23 49/week @ 2019-03-30 52/week @ 2019-04-06 165/week @ 2019-04-13 81/week @ 2019-04-20 48/week @ 2019-04-27

374 downloads per month
Used in 3 crates


123 lines

A plugin to insert appropriate flame::start_guard(_) calls (for use with flame)

Build Status Current Version Docs

This needs a nightly rustc! Because flamer is a compiler plugin, it uses unstable APIs, which are not available on stable or beta. It may be possible to extend flamer to allow use with syntex, but this hasn't been tried yet.


In your Cargo.toml add flame and flamer to your dependencies:

flame = "0.2.2"
flamer = "0.3"

Then in your crate root, add the following:

#[macro_use] extern crate flamer;

extern crate flame;

// The item to apply `flame` to goes here.

You may also opt for an optional dependency. In that case your Cargo.toml should have:

flame = { version = "0.2.2", optional = true }
flamer = { version = "0.3", optional = true }

default = []
flame_it = ["flame", "flamer"]

And your crate root should contain:

#![cfg_attr(feature="flame_it", feature(proc_macro_hygiene))]

#[macro_use] extern crate flamer;

extern crate flame;

// as well as the following instead of `#[flame]`
#[cfg_attr(feature="flame_it", flame)]
// The item to apply `flame` to goes here.
mod flamed_module { .. }

You should then be able to annotate every item (alas, currently not the whole crate) with #[flame] annotations. You can also use #[noflame] annotations to disable instrumentations for subitems of #[flame]d items. Note that this only instruments the annotated methods, it does not print out the results.

The flame annotation can also take an optional parameter specifying a string to prefix to enclosed method names. This is especially useful when annotating multiple methods with the same name, but in different modules.

fn method_name() {
    //The corresponding block on the flamegraph will be named "prefix::method_name"

Refer to flame's documentation to see how output works.

License: Apache 2.0


~33K SLoC