diff options
Diffstat (limited to 'crates/ra_prof/src')
-rw-r--r-- | crates/ra_prof/src/lib.rs | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/crates/ra_prof/src/lib.rs b/crates/ra_prof/src/lib.rs index 89df7f04b..b54531b4e 100644 --- a/crates/ra_prof/src/lib.rs +++ b/crates/ra_prof/src/lib.rs | |||
@@ -19,6 +19,10 @@ pub use crate::{ | |||
19 | #[global_allocator] | 19 | #[global_allocator] |
20 | static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; | 20 | static ALLOC: jemallocator::Jemalloc = jemallocator::Jemalloc; |
21 | 21 | ||
22 | #[cfg(all(feature = "mimalloc"))] | ||
23 | #[global_allocator] | ||
24 | static ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc; | ||
25 | |||
22 | /// Prints backtrace to stderr, useful for debugging. | 26 | /// Prints backtrace to stderr, useful for debugging. |
23 | #[cfg(feature = "backtrace")] | 27 | #[cfg(feature = "backtrace")] |
24 | pub fn print_backtrace() { | 28 | pub fn print_backtrace() { |
@@ -43,6 +47,7 @@ pub struct Scope { | |||
43 | } | 47 | } |
44 | 48 | ||
45 | impl Scope { | 49 | impl Scope { |
50 | #[must_use] | ||
46 | pub fn enter() -> Scope { | 51 | pub fn enter() -> Scope { |
47 | let prev = IN_SCOPE.with(|slot| std::mem::replace(&mut *slot.borrow_mut(), true)); | 52 | let prev = IN_SCOPE.with(|slot| std::mem::replace(&mut *slot.borrow_mut(), true)); |
48 | Scope { prev } | 53 | Scope { prev } |
@@ -65,7 +70,8 @@ impl Drop for Scope { | |||
65 | /// 2. Build with `cpu_profiler` feature. | 70 | /// 2. Build with `cpu_profiler` feature. |
66 | /// 3. Tun the code, the *raw* output would be in the `./out.profile` file. | 71 | /// 3. Tun the code, the *raw* output would be in the `./out.profile` file. |
67 | /// 4. Install pprof for visualization (https://github.com/google/pprof). | 72 | /// 4. Install pprof for visualization (https://github.com/google/pprof). |
68 | /// 5. Use something like `pprof -svg target/release/rust-analyzer ./out.profile` to see the results. | 73 | /// 5. Bump sampling frequency to once per ms: `export CPUPROFILE_FREQUENCY=1000` |
74 | /// 6. Use something like `pprof -svg target/release/rust-analyzer ./out.profile` to see the results. | ||
69 | /// | 75 | /// |
70 | /// For example, here's how I run profiling on NixOS: | 76 | /// For example, here's how I run profiling on NixOS: |
71 | /// | 77 | /// |
@@ -73,11 +79,16 @@ impl Drop for Scope { | |||
73 | /// $ nix-shell -p gperftools --run \ | 79 | /// $ nix-shell -p gperftools --run \ |
74 | /// 'cargo run --release -p rust-analyzer -- parse < ~/projects/rustbench/parser.rs > /dev/null' | 80 | /// 'cargo run --release -p rust-analyzer -- parse < ~/projects/rustbench/parser.rs > /dev/null' |
75 | /// ``` | 81 | /// ``` |
82 | /// | ||
83 | /// See this diff for how to profile completions: | ||
84 | /// | ||
85 | /// https://github.com/rust-analyzer/rust-analyzer/pull/5306 | ||
76 | #[derive(Debug)] | 86 | #[derive(Debug)] |
77 | pub struct CpuProfiler { | 87 | pub struct CpuProfiler { |
78 | _private: (), | 88 | _private: (), |
79 | } | 89 | } |
80 | 90 | ||
91 | #[must_use] | ||
81 | pub fn cpu_profiler() -> CpuProfiler { | 92 | pub fn cpu_profiler() -> CpuProfiler { |
82 | #[cfg(feature = "cpu_profiler")] | 93 | #[cfg(feature = "cpu_profiler")] |
83 | { | 94 | { |