1
0
mirror of https://github.com/golang/go synced 2024-10-01 01:28:32 -06:00
go/cmd/guru
Josh Bleecher Snyder 1e1ec013b9 cmd/guru: optimize global pkglevel referrer queries
Global, package-level queries can be done without typechecking.
This makes it significantly cheaper.

Instead of typechecking, consider all packages that directly
import the query package. In each of those packages, filter out:

* files that don't contain the query name
* files that don't import the query package

Fully parse the remaining files and look for selector expressions
matching the query package and name.

There are a few twists (dot imports, the query package, xtests).
They are described, along with how they are handled,
in the large comment at the beginning of globalReferrersPkgLevel.

On my machine and GOPATH, this reduces typical time
needed to find referrers to encoding/json.MarshalIndent
from (roughly)

real	0m39.946s
user	2m27.844s
sys	0m54.774s

to (roughly)

real	0m5.687s
user	0m15.793s
sys	0m16.001s

The processing of packages could be parallelized;
that is left for a future change, to ease reviewing.

Benefits from that will be limited;
building the reverse import graph accounts for 73%
of the runtime, and that is dominated by syscalls.

Optimization idea from Alan Donovan.

This work supported by Sourcegraph.

Change-Id: Ib19e25fcdcb27673fb03d7300dba2a53198901ad
Reviewed-on: https://go-review.googlesource.com/97800
Reviewed-by: Alan Donovan <adonovan@google.com>
Run-TryBot: Josh Bleecher Snyder <josharian@gmail.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
2018-05-01 18:10:48 +00:00
..
serial cmd/guru: support streaming plain and -json output 2016-04-11 19:51:55 +00:00
testdata/src cmd/guru: always import tests in initial referrers import 2018-04-23 20:00:06 +00:00
callees.go x/tools/cmd/guru: gofmt -s -w 2017-02-15 21:41:53 +00:00
callers.go cmd/guru: add workaround to handle inconsistency between go/types and gc 2016-11-23 20:09:00 +00:00
callstack.go cmd/guru: add workaround to handle inconsistency between go/types and gc 2016-11-23 20:09:00 +00:00
definition.go cmd/guru: revert support for Go 1.8 aliases 2016-11-04 21:18:07 +00:00
describe.go x/tools: support Go 1.9 type aliases 2017-02-13 21:46:59 +00:00
freevars.go cmd/guru: support streaming plain and -json output 2016-04-11 19:51:55 +00:00
guru_test.go cmd/guru: make tests granular and parallel 2018-04-23 19:59:51 +00:00
guru.go x/tools/cmd/guru: remove unused method. 2017-03-01 14:52:51 +00:00
implements.go x/tools: support Go 1.9 type aliases 2017-02-13 21:46:59 +00:00
isAlias18.go x/tools: support Go 1.9 type aliases 2017-02-13 21:46:59 +00:00
isAlias19.go x/tools: support Go 1.9 type aliases 2017-02-13 21:46:59 +00:00
main.go cmd/guru: update link to documentation 2016-07-08 22:10:47 +00:00
peers.go cmd/guru: add workaround to handle inconsistency between go/types and gc 2016-11-23 20:09:00 +00:00
pointsto.go cmd/guru: add workaround to handle inconsistency between go/types and gc 2016-11-23 20:09:00 +00:00
pos.go cmd/guru: fix typo of 'hyphen' to rename to 'comma' 2017-01-25 19:35:15 +00:00
referrers.go cmd/guru: optimize global pkglevel referrer queries 2018-05-01 18:10:48 +00:00
unit_test.go go/buildutil, cmd/guru: resolve symlinks in filenames through build.Context 2016-12-06 21:45:43 +00:00
what.go cmd/guru: report 'whicherrs' in modes of 'what' query 2017-03-04 02:31:33 +00:00
whicherrs.go x/tools: support Go 1.9 type aliases 2017-02-13 21:46:59 +00:00