Skip to content

Commit 0309919

Browse files
jensjohaCommit Queue
authored andcommitted
[analyzer server] Legacy protocol debounces hover requests too
TL;DR: By only responding (for real) to the newest hover request a benchmark that used to take ~10 seconds now takes ~0.6 seconds. Details: In #55281 (comment) I noticed that some of the performance issues people are seeing fom the analyzer server stem from many requests being fired, each taking longer the wait before the next is issued, naturally building up a longer and loger queue before responses are made. Their it was for `edit.getFixes`, but I'm yet to actually reproduce that. I did reproduce for hover requests though, so here I'm debounsing those hover requests. I'm hooking into the system that already debounces completion requests and following the pattern used there. On my machine, running ``` out/ReleaseX64/dart-sdk/bin/dart \ pkg/analysis_server/tool/benchmark_tools/big_chain_benchmark/legacy_many_hover_requests.dart ``` I get these numbers: Before CL (taken from the parent CL that introduces the benchmark): ``` 4 files / CodeType.ImportCycle: Initial analysis: 1.249438 Completion after change: 10.143719 4 files / CodeType.ImportChain: Initial analysis: 1.367604 Completion after change: 9.936909 4 files / CodeType.ImportExportCycle: Initial analysis: 1.233644 Completion after change: 10.011695 4 files / CodeType.ImportExportChain: Initial analysis: 1.226382 Completion after change: 9.875991 4 files / CodeType.ImportCycleExportChain: Initial analysis: 1.262932 Completion after change: 9.995607 ``` With CL: ``` 4 files / CodeType.ImportCycle: Initial analysis: 1.322501 Completion after change: 0.569768 4 files / CodeType.ImportChain: Initial analysis: 1.347588 Completion after change: 0.635748 4 files / CodeType.ImportExportCycle: Initial analysis: 1.492362 Completion after change: 0.575233 4 files / CodeType.ImportExportChain: Initial analysis: 1.331619 Completion after change: 0.576199 4 files / CodeType.ImportCycleExportChain: Initial analysis: 1.342130 Completion after change: 0.608064 ``` Change-Id: Ide3dbc4dfb885af9e1c46a763338ba545c0ab7db Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/413982 Reviewed-by: Phil Quitslund <[email protected]> Commit-Queue: Jens Johansen <[email protected]>
1 parent c3fa09f commit 0309919

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

pkg/analysis_server/lib/src/server/debounce_requests.dart

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ import 'package:analysis_server/src/channel/channel.dart';
1616
/// then most probably the user continued typing, and there is no need to
1717
/// compute results for the first request. But we will have to respond, an
1818
/// empty response is enough.
19+
/// The same goes for hover requests.
1920
///
2021
/// Discarded requests are reported into [discardedRequests].
2122
Stream<RequestOrResponse> debounceRequests(
@@ -44,7 +45,7 @@ class _DebounceRequests {
4445
// quickly get all of them. So, even 1 ms should be enough.
4546
timer ??= Timer(const Duration(milliseconds: 1), () {
4647
timer = null;
47-
var filtered = _filterCompletion(buffer);
48+
var filtered = _filterRequests(buffer);
4849
buffer = [];
4950
for (var request in filtered) {
5051
sink.add(request);
@@ -55,15 +56,16 @@ class _DebounceRequests {
5556
);
5657
}
5758

58-
List<RequestOrResponse> _filterCompletion(List<RequestOrResponse> requests) {
59+
List<RequestOrResponse> _filterRequests(List<RequestOrResponse> requests) {
5960
var reversed = <RequestOrResponse>[];
6061
var abortCompletionRequests = false;
62+
var abortHoverRequests = false;
6163
for (var requestOrResponse in requests.reversed) {
6264
if (requestOrResponse is Request) {
6365
if (requestOrResponse.method == ANALYSIS_REQUEST_UPDATE_CONTENT) {
6466
abortCompletionRequests = true;
65-
}
66-
if (requestOrResponse.method == COMPLETION_REQUEST_GET_SUGGESTIONS2) {
67+
} else if (requestOrResponse.method ==
68+
COMPLETION_REQUEST_GET_SUGGESTIONS2) {
6769
if (abortCompletionRequests) {
6870
discardedRequests.add(requestOrResponse);
6971
var params = CompletionGetSuggestions2Params.fromRequest(
@@ -85,6 +87,21 @@ class _DebounceRequests {
8587
} else {
8688
abortCompletionRequests = true;
8789
}
90+
} else if (requestOrResponse.method == ANALYSIS_REQUEST_GET_HOVER) {
91+
if (abortHoverRequests) {
92+
discardedRequests.add(requestOrResponse);
93+
channel.sendResponse(
94+
AnalysisGetHoverResult([]).toResponse(
95+
requestOrResponse.id,
96+
// We can use a null converter here because we're not sending
97+
// any path.
98+
clientUriConverter: null,
99+
),
100+
);
101+
continue;
102+
} else {
103+
abortHoverRequests = true;
104+
}
88105
}
89106
}
90107
reversed.add(requestOrResponse);

0 commit comments

Comments
 (0)