mirror of https://github.com/golang/go.git
When searching for deep completions, we can end up enumerating struct types' fields a lot. Optimize fieldSelections to reduce work: - Wait until we see an embedded field before we create the "seen" map. - Use a callback style to iterate over the struct's fields rather than returning a slice of fields. - Change "seen" checking strategy back to track struct types rather than each individual field. Struct with 5 non-embedded fields: name old time/op new time/op delta Fields-16 293ns ± 1% 20ns ± 2% -93.13% (p=0.008 n=5+5) name old alloc/op new alloc/op delta Fields-16 120B ± 0% 0B -100.00% (p=0.008 n=5+5) name old allocs/op new allocs/op delta Fields-16 4.00 ± 0% 0.00 -100.00% (p=0.008 n=5+5) Same struct but add an embedded struct with 2 fields: name old time/op new time/op delta Fields-16 389ns ± 1% 142ns ± 1% -63.53% (p=0.008 n=5+5) name old alloc/op new alloc/op delta Fields-16 120B ± 0% 144B ± 0% +20.00% (p=0.008 n=5+5) name old allocs/op new allocs/op delta Fields-16 4.00 ± 0% 2.00 ± 0% -50.00% (p=0.008 n=5+5) I think the alloc/op went up because the "seen" map is no longer allocated on the stack. There is more room for more optimization, but it's probably not worth making things more complicated. Change-Id: I6f9f2124334a8594ef9d6f9b5ac4b3a8aead5f49 Reviewed-on: https://go-review.googlesource.com/c/tools/+/223419 Run-TryBot: Muir Manders <muir@mnd.rs> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rebecca Stambler <rstambler@golang.org> |
||
|---|---|---|
| .. | ||
| code_lens.go | ||
| comment.go | ||
| comment_test.go | ||
| completion.go | ||
| completion_builtin.go | ||
| completion_format.go | ||
| completion_keywords.go | ||
| completion_labels.go | ||
| completion_literal.go | ||
| completion_snippet.go | ||
| completion_statements.go | ||
| deep_completion.go | ||
| diagnostics.go | ||
| folding_range.go | ||
| format.go | ||
| format_test.go | ||
| highlight.go | ||
| hover.go | ||
| identifier.go | ||
| implementation.go | ||
| options.go | ||
| references.go | ||
| rename.go | ||
| rename_check.go | ||
| signature_help.go | ||
| source_test.go | ||
| symbols.go | ||
| util.go | ||
| view.go | ||
| workspace_symbol.go | ||