A set of macros to function profiling
Contains some convenient macros to analyze function execution, like count to know how many times a function was called, trace to log when entering/exiting from a function and what are its arguments, and cache for pure functions cache.
Features
| Feature | Description | Additional dependencies |
|---|---|---|
count |
Makes available a macro count! to get how many times a function was called |
None |
trace |
Prints when entering/exiting in a tagged function and its arguments | None |
cache |
Implements memoization for a tagged function | lazy_static and hashbrown |
visible |
Changes the cache storage and counter visibility | None |
Each feature can be forbided, forced or setted to global config (setted by features) in the attribute declaration. E.g:
Dependencies
cache requires that both lazy_static and hashbrown are enabled in the target module. When enabled in a function, it also requires that all parameters implement the Debug trait and Clone for the return type.
Wait... Why Debug for parameters and not Clone?
Consider these scenarios:
It's hard to create cache storage with generic keys and lifetimes, once it can't be parsed in an equivalent format for a global RwLock.
Furthermore, it allows some optimizations for liked types:
I don't want trace/count/cache in my release builds. How do I disable it?
There isn't yet a good way to enable/disable specific features in different profiles. You'll need to set default-features to false and define which features you want. E.g:
[]
= { = "*", = false, = ["cache", "count", "time"] }
Another way to do it, is using a setting a default feature.
[]
= { = "*", = false, = ["cache", "count", "time"] }
[]
= ["debug_mode"]
= ["moneta_fn/trace"]
And when compiling with a profile relase, use --no-default-features
How do I enable/disable trace/count/cache for just one function?
Set trace/count/cache as force/forbid
// Will not update cache storage
Will count!/get_cache! calls break when the count/cache feature is disabled?
No. The counting or cache will just not be updated.