1
0
mirror of https://github.com/golang/go synced 2024-09-30 22:58:34 -06:00
go/internal/lsp
Muir Manders 613a0345a2 internal/lsp/source: optimize enumeration of a type's fields
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>
2020-03-18 05:47:12 +00:00
..
browser internal/lsp: add version and bug commands 2019-05-11 04:16:02 +00:00
cache internal/lsp/cache: fix typo 2020-03-16 18:21:19 +00:00
cmd x/tools/gopls: add support for $/progress functionality 2020-03-16 21:25:24 +00:00
debug internal/telemetry: convert key from string to struct 2020-03-12 04:17:52 +00:00
diff internal/span,lsp: disambiguate URIs, DocumentURIs, and paths 2020-02-14 22:51:03 +00:00
fake x/tools/gopls: add support for $/progress functionality 2020-03-16 21:25:24 +00:00
fuzzy internal/lsp: make golint happy 2019-12-23 18:17:04 +00:00
helper internal/lsp: change to helper.go to output a formatted file 2020-01-31 20:35:38 +00:00
lsprpc internal/lsp/lsprpc: expose configuration for auto-started daemon 2020-03-12 19:43:16 +00:00
mod internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
protocol internal/lsp: fix code.ts to generate progress and *TextEdit 2020-03-17 18:47:13 +00:00
regtest internal/lsp/lsprpc: expose configuration for auto-started daemon 2020-03-12 19:43:16 +00:00
snippet all: fix broken links to LSP specification 2019-10-02 18:32:53 +00:00
source internal/lsp/source: optimize enumeration of a type's fields 2020-03-18 05:47:12 +00:00
telemetry internal/telemetry: convert key from string to struct 2020-03-12 04:17:52 +00:00
testdata internal/lsp: fix breadcrumbs when inside of a method 2020-03-17 19:04:34 +00:00
tests internal/lsp/tests: fix WorkspaceSymbols tests 2020-03-11 18:46:36 +00:00
code_action.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
command.go x/tools/gopls: run go generate through CodeLens 2020-03-17 04:34:34 +00:00
completion_test.go internal/span,lsp: disambiguate URIs, DocumentURIs, and paths 2020-02-14 22:51:03 +00:00
completion.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
definition.go internal/lsp/source: return location(s) for imported packages 2020-03-09 16:25:02 +00:00
diagnostics.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
folding_range.go internal/lsp: check for file URIs on LSP requests 2020-02-14 22:51:26 +00:00
format.go internal/lsp: support textDocument/formatting for .mod extension 2020-03-06 13:51:27 +00:00
general.go x/tools/gopls: add support for $/progress functionality 2020-03-16 21:25:24 +00:00
generate.go x/tools/gopls: 'go generate' should use $/progress if available 2020-03-17 19:18:43 +00:00
highlight.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
hover.go internal/lsp: support textDocument/hover for .mod extension 2020-02-26 15:59:49 +00:00
implementation.go internal/lsp: check for file URIs on LSP requests 2020-02-14 22:51:26 +00:00
link.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
lsp_test.go internal/lsp: support when hierarchicalDocumentSymbolSupport is false 2020-03-06 18:17:37 +00:00
references.go internal/lsp: check for file URIs on LSP requests 2020-02-14 22:51:26 +00:00
rename.go internal/lsp: check for file URIs on LSP requests 2020-02-14 22:51:26 +00:00
reset_golden.sh internal/lsp: fix regeneration of golden files 2019-09-25 13:16:59 +00:00
server_gen.go x/tools/gopls: add support for $/progress functionality 2020-03-16 21:25:24 +00:00
server.go x/tools/gopls: run go generate through CodeLens 2020-03-17 04:34:34 +00:00
signature_help.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
symbols.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
text_synchronization.go internal/lsp: clear diagnostics for deleted files 2020-02-19 20:26:41 +00:00
workspace_symbol.go internal/lsp: migrate telemetry to using the event package 2020-03-12 03:59:16 +00:00
workspace.go internal/lsp: generate boilerplate stubs for type Server 2020-01-24 14:41:51 +00:00