internal/lsp/cache: only clone metadata if something changed

We with immutable metadata, we don't need to clone if nothing was
invalidated.

Benchmark (didChange in k8s): 65ms->45ms

For golang/go#45686

Change-Id: I6b5e764c53a35784fd8c7b43bc26361f4ee8d928
Reviewed-on: https://go-review.googlesource.com/c/tools/+/340853
Run-TryBot: Robert Findley <rfindley@google.com>
Reviewed-by: Alan Donovan <adonovan@google.com>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
This commit is contained in:
Rob Findley 2021-08-09 10:54:27 -04:00 committed by Robert Findley
parent 4ba3d2217f
commit dffd6452c0
1 changed files with 9 additions and 2 deletions

View File

@ -2016,8 +2016,15 @@ func (s *snapshot) clone(ctx, bgCtx context.Context, changes map[span.URI]*fileC
}
}
result.meta = s.meta.Clone(metadataUpdates)
result.workspacePackages = computeWorkspacePackages(result.meta)
if len(metadataUpdates) > 0 {
result.meta = s.meta.Clone(metadataUpdates)
result.workspacePackages = computeWorkspacePackages(result.meta)
} else {
// No metadata changes. Since metadata is only updated by cloning, it is
// safe to re-use the existing metadata here.
result.meta = s.meta
result.workspacePackages = s.workspacePackages
}
// Inherit all of the go.mod-related handles.
for _, v := range result.modTidyHandles {