11 releases

Uses old Rust 2015

0.4.0 Aug 15, 2019
0.3.0 Nov 6, 2018
0.2.5 Jul 13, 2018
0.2.0 Jan 8, 2018
0.1.2 Jul 8, 2016

#11 in Profiling

Download history 232/week @ 2020-05-29 190/week @ 2020-06-05 141/week @ 2020-06-12 202/week @ 2020-06-19 146/week @ 2020-06-26 74/week @ 2020-07-03 88/week @ 2020-07-10 110/week @ 2020-07-17 138/week @ 2020-07-24 147/week @ 2020-07-31 205/week @ 2020-08-07 196/week @ 2020-08-14 282/week @ 2020-08-21 259/week @ 2020-08-28 175/week @ 2020-09-04 156/week @ 2020-09-11

761 downloads per month
Used in 11 crates (9 directly)

Apache-2.0

10KB
123 lines

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

Build Status Current Version Docs Supported Rust Versions

This proc macro requires Rust 1.30. Because flamer is a proc macro attribute, it uses APIs stabilized in Rust 1.30.

Usage:

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

[dependencies]
flame = "0.2.2"
flamer = "0.3"

Then in your crate root, add the following:

extern crate flame;
#[macro_use] extern crate flamer;

#[flame]
// The item to apply `flame` to goes here.

Unfortunately, currently stable Rust doesn't allow custom attributes on modules. To use #[flame] on modules you need a nightly Rust with #![feature(proc_macro_hygiene)] in the crate root (related issue):

#![feature(proc_macro_hygiene)]

extern crate flame;
#[macro_use] extern crate flamer;

#[flame]
mod flamed_module { .. }

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

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

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

And your crate root should contain:

#[cfg(feature = "flame_it")]
extern crate flame;
#[cfg(feature = "flame_it")]
#[macro_use] extern crate flamer;

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

For nightly module support, also add #![cfg_attr(feature = "flame_it", feature(proc_macro_hygiene))] in the crate root:

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

#[cfg(feature = "flame_it")]
extern crate flame;
#[cfg(feature = "flame_it")]
#[macro_use] extern crate flamer;

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

You should then be able to annotate every item (alas, currently not the whole crate; see the custom inner attribute issue for more details) 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.

#[flame("prefix")]
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

Dependencies

~1.3–1.7MB
~35K SLoC