Find a file
Jens Johansen e70befdcbd [analyzer] Only search the same files for the same thing once
TL;DR:

56c416430e vs this CL:

textDocument/implementation (non-first runs):
```
Difference at 95.0% confidence
        -3.6465 +/- 0.307413
        -82.3689% +/- 6.94398%
        (Student's t, pooled s = 0.238983)
```
I.e. from ~4.4s to ~0.78s on non-first runs.

textDocument/references (non-first runs):
```
Difference at 95.0% confidence
        -33.1856 +/- 0.789512
        -91.4283% +/- 2.17515%
        (Student's t, pooled s = 0.613768)
```
I.e. from ~36.2s to ~3.11s on non-first runs.

Raw data below.


Details:

When having multiple workspace folders open, sometimes the drivers
representing these folders will have overlapping files.
For instance in my "analyzer" workspace there are a total of ~7000
unique files but if just adding each drives known files there’s
40,000+ files.

When asking for all direct subtypes of a class the a
`_FilesReferencingNameTask` does a lookup in a set for every known file
of that drive, meaning that in practice, often the same set is queried
for the same thing many times.

This CL instead assigns each `Drive` the files it was to look at,
each set will therefore only be querues once per type.

This takes the number of operations (per type) from `N*M` where `N` and
`M` are number of drives and number of files respectively (as each drive
could know all the same files) to just `M`, i.e. number of files.

This CL takes the runtime for asking for implementations of 'ToJsonable'
from package:analysis_server/lsp_protocol/protocol_special.dart in my
analyzer workspace (with 8 workspace folders / drivers) from ~4.4 seconds
to ~0.8 seconds (see below for details).
It also takes a call for "find all references" ("textDocument/references")
on method "newFile" in class "AbstractSingleUnitTest" in
"analysis_server/test/abstract_single_unit.dart" from ~36 seconds
to ~3.2 seconds (see below for details).


Raw data:

HEAD as of 56c416430e

textDocument/implementation
===========================
(notice the first query taking a long time)

(restart analyzer process)
Got answer to query in 0:00:28.921389
Got answer to query in 0:00:04.270255
Got answer to query in 0:00:04.248489

(restart analyzer process)
Got answer to query in 0:00:08.319562
Got answer to query in 0:00:04.232582
Got answer to query in 0:00:04.102793

(restart analyzer process)
Got answer to query in 0:00:09.186371
Got answer to query in 0:00:04.867653
Got answer to query in 0:00:04.840468


textDocument/references
=======================
(notice the first query taking slightly longer)

(restart analyzer process)
Got answer to query in 0:00:41.916106
Got answer to query in 0:00:36.619501
Got answer to query in 0:00:36.502156

(restart analyzer process)
Got answer to query in 0:00:40.353819
Got answer to query in 0:00:37.709369
Got answer to query in 0:00:36.086530

(restart analyzer process)
Got answer to query in 0:00:40.052997
Got answer to query in 0:00:35.273826
Got answer to query in 0:00:35.589722



WITH CL

textDocument/implementation
===========================
(notice the first query taking a long time)

(restart analyzer process)
Got answer to query in 0:00:11.902654
Got answer to query in 0:00:00.742324
Got answer to query in 0:00:00.730748

(restart analyzer process)
Got answer to query in 0:00:04.966440
Got answer to query in 0:00:00.795087
Got answer to query in 0:00:00.820526

(restart analyzer process)
Got answer to query in 0:00:04.838173
Got answer to query in 0:00:00.810417
Got answer to query in 0:00:00.784124

textDocument/references
=======================
(notice the first query taking a long time)

(restart analyzer process)
Got answer to query in 0:00:07.632822
Got answer to query in 0:00:03.098794
Got answer to query in 0:00:03.008570

(restart analyzer process)
Got answer to query in 0:00:07.690932
Got answer to query in 0:00:03.062484
Got answer to query in 0:00:03.088793

(restart analyzer process)
Got answer to query in 0:00:07.786218
Got answer to query in 0:00:03.160477
Got answer to query in 0:00:03.248359

Change-Id: I18a3cbd870f62e87937f92942460baccf8bce088
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/272560
Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
Commit-Queue: Jens Johansen <jensj@google.com>
2022-11-30 09:03:39 +00:00
.dart_tool [infra] re-land work to auto-generate .dart_tool/package_config.json 2022-04-12 17:21:02 +00:00
.github [infra] update the scorecards-analysis.yml file 2022-11-17 19:52:57 +00:00
benchmarks [benchmarks] Use gen_kernel instead of dart2js for isolate group benchmarks. 2022-11-21 22:25:59 +00:00
build [vm] Avoid using -fno-exceptions globally in GN builds. 2022-11-18 09:42:48 +00:00
docs Add a link to the announce group 2022-07-21 09:45:06 +00:00
pkg [analyzer] Only search the same files for the same thing once 2022-11-30 09:03:39 +00:00
runtime [vm/aot] Unbox 2-field records in return values 2022-11-29 21:41:49 +00:00
samples Fix grammar 2022-11-21 20:07:29 +00:00
sdk Add PathExistsException and PathAccessException FileSystemException subclasses. 2022-11-30 04:54:52 +00:00
tests Add PathExistsException and PathAccessException FileSystemException subclasses. 2022-11-30 04:54:52 +00:00
third_party [dart2wasm] Remove unnecessary rebase_path when running list_sources.py 2022-11-19 22:53:26 +00:00
tools [spec_parser] Change logical pattern rules to '||' and '&&' 2022-11-28 14:23:34 +00:00
utils [dart2js] Add mmap-based read to dart2js for linux systems. 2022-11-18 21:40:38 +00:00
.clang-format
.gitattributes [web] rename suite dart2js -> web. 2021-02-04 23:11:32 +00:00
.gitconfig [infra] Add documentation to .gitconfig 2018-06-11 18:24:16 +00:00
.gitignore [test_runner] Create --write-logs dir, add default dir to .gitignore 2022-11-15 09:59:08 +00:00
.gn [infra] Migrate scripts to python3 2021-04-15 10:10:20 +00:00
.mailmap Fixed various typos in a lot of files 2022-07-25 12:21:59 +00:00
.style.yapf Mass format python with yapf 2019-08-05 20:34:31 +00:00
.vpython [infra] Add .vpython spec to fix gsutil on the bots (#31065) 2018-10-11 15:11:35 +00:00
AUTHORS Simplify the license situation 2022-09-14 21:06:22 +00:00
BUILD.gn [dart2wasm] Add building binaryen as part of our GN build 2022-11-18 10:58:54 +00:00
CHANGELOG.md Add PathExistsException and PathAccessException FileSystemException subclasses. 2022-11-30 04:54:52 +00:00
codereview.settings [infra] Default presubmits to use python3 2021-08-24 08:20:47 +00:00
CONTRIBUTING.md Add more details to contributing docs 2022-03-16 07:56:58 +00:00
DEPS linter 1.31.0 2022-11-30 02:11:07 +00:00
LICENSE Update LICENSE 2021-04-08 07:57:10 +00:00
OWNERS [owners] update the top-level owners file 2022-11-11 21:03:52 +00:00
PATENT_GRANT Rename patent file 2019-08-16 12:03:17 +00:00
PRESUBMIT.py Make presubmit on Dart files check for default value separator. 2022-09-09 12:34:34 +00:00
README.dart-sdk Updates to analyze_snapshot tool 2022-08-23 12:18:00 +00:00
README.md master => main 2021-09-10 08:02:49 +00:00
sdk_args.gni Fix typos 2022-06-15 11:08:28 +00:00
SECURITY.md Add link to published advisories 2022-02-08 19:45:07 +00:00
WATCHLISTS [dart2wasm] Update WATCHLISTS for dart2wasm-team@. 2022-11-10 17:00:40 +00:00

Dart

A client-optimized language for fast apps on any platform

Dart is:

  • Optimized for UI: Develop with a programming language specialized around the needs of user interface creation.

  • Productive: Make changes iteratively: use hot reload to see the result instantly in your running app.

  • Fast on all platforms: Compile to ARM & x64 machine code for mobile, desktop, and backend. Or compile to JavaScript for the web.

Dart's flexible compiler technology lets you run Dart code in different ways, depending on your target platform and goals:

  • Dart Native: For programs targeting devices (mobile, desktop, server, and more), Dart Native includes both a Dart VM with JIT (just-in-time) compilation and an AOT (ahead-of-time) compiler for producing machine code.

  • Dart Web: For programs targeting the web, Dart Web includes both a development time compiler (dartdevc) and a production time compiler (dart2js).

Dart platforms illustration

License & patents

Dart is free and open source.

See LICENSE and PATENT_GRANT.

Using Dart

Visit dart.dev to learn more about the language, tools, and to find codelabs.

Browse pub.dev for more packages and libraries contributed by the community and the Dart team.

Our API reference documentation is published at api.dart.dev, based on the stable release. (We also publish docs from our beta and dev channels, as well as from the primary development branch).

Building Dart

If you want to build Dart yourself, here is a guide to getting the source, preparing your machine to build the SDK, and building.

There are more documents on our wiki.

Contributing to Dart

The easiest way to contribute to Dart is to file issues.

You can also contribute patches, as described in Contributing.