diff options
author | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-04-22 16:09:22 +0100 |
---|---|---|
committer | bors[bot] <bors[bot]@users.noreply.github.com> | 2019-04-22 16:09:22 +0100 |
commit | 1705e5887d5c71cad846cb7e840b3c4e03942856 (patch) | |
tree | d1082112c172b8a7d20e72d02e9de8f60cfa5bc1 /crates/ra_mbe/src | |
parent | c416caeda2a09e84dc9cd201eff0bf04b701ae34 (diff) | |
parent | fccd0452299c8261e0298688d29e934b0fef1605 (diff) |
Merge #1195
1195: Add cached for SubtreeSource r=matklad a=edwin0cheng
I just did some simple profiling, the most slowest part of the mbe related code is the tree traversal, so i add a very simple cache in here is the result:
``` target\release\ra_cli analysis-stats```
*Before
```
Database loaded, 21 roots, 1.2731481s
Crates in this dir: 26
Total modules found: 282
Total declarations: 4783
Total functions: 3126
Total expressions: 59452
Expressions of unknown type: 8999 (15%)
Expressions of partially unknown type: 2672 (4%)
Analysis: 17.9596334s
```
```
*After
Database loaded, 21 roots, 1.7425901s
Crates in this dir: 26
Total modules found: 282
Total declarations: 4783
Total functions: 3126
Total expressions: 59452
Expressions of unknown type: 8999 (15%)
Expressions of partially unknown type: 2672 (4%)
Analysis: 13.4007118s
```
Save 4 seconds :)
Co-authored-by: Edwin Cheng <[email protected]>
Diffstat (limited to 'crates/ra_mbe/src')
-rw-r--r-- | crates/ra_mbe/src/subtree_source.rs | 24 |
1 files changed, 20 insertions, 4 deletions
diff --git a/crates/ra_mbe/src/subtree_source.rs b/crates/ra_mbe/src/subtree_source.rs index 20da1e9f7..3229cfa8f 100644 --- a/crates/ra_mbe/src/subtree_source.rs +++ b/crates/ra_mbe/src/subtree_source.rs | |||
@@ -219,17 +219,33 @@ pub(crate) trait Querier { | |||
219 | #[derive(Debug)] | 219 | #[derive(Debug)] |
220 | pub(crate) struct WalkerOwner<'a> { | 220 | pub(crate) struct WalkerOwner<'a> { |
221 | walker: RefCell<SubTreeWalker<'a>>, | 221 | walker: RefCell<SubTreeWalker<'a>>, |
222 | cached: RefCell<Vec<Option<TtToken>>>, | ||
222 | } | 223 | } |
223 | 224 | ||
224 | impl<'a> WalkerOwner<'a> { | 225 | impl<'a> WalkerOwner<'a> { |
225 | fn new<I: Into<TokenSeq<'a>>>(ts: I) -> Self { | 226 | fn new<I: Into<TokenSeq<'a>>>(ts: I) -> Self { |
226 | WalkerOwner { walker: RefCell::new(SubTreeWalker::new(ts.into())) } | 227 | WalkerOwner { |
228 | walker: RefCell::new(SubTreeWalker::new(ts.into())), | ||
229 | cached: RefCell::new(Vec::with_capacity(10)), | ||
230 | } | ||
227 | } | 231 | } |
228 | 232 | ||
229 | fn get<'b>(&self, pos: usize) -> Option<TtToken> { | 233 | fn get<'b>(&self, pos: usize) -> Option<TtToken> { |
230 | self.set_pos(pos); | 234 | let mut cached = self.cached.borrow_mut(); |
231 | let walker = self.walker.borrow(); | 235 | if pos < cached.len() { |
232 | walker.current().cloned() | 236 | return cached[pos].clone(); |
237 | } | ||
238 | |||
239 | while pos >= cached.len() { | ||
240 | let len = cached.len(); | ||
241 | cached.push({ | ||
242 | self.set_pos(len); | ||
243 | let walker = self.walker.borrow(); | ||
244 | walker.current().cloned() | ||
245 | }); | ||
246 | } | ||
247 | |||
248 | return cached[pos].clone(); | ||
233 | } | 249 | } |
234 | 250 | ||
235 | fn set_pos(&self, pos: usize) { | 251 | fn set_pos(&self, pos: usize) { |