33f664940a
Change-Id: I04bc285d822a657adb5573c6de3eb38655ab0fcd Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/448232 Reviewed-by: Brian Wilkerson <brianwilkerson@google.com> Commit-Queue: Samuel Rawlins <srawlins@google.com>
106 lines
3.7 KiB
Dart
106 lines
3.7 KiB
Dart
// Copyright (c) 2024, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
import 'package:analysis_server/src/services/completion/dart/completion_manager.dart';
|
|
import 'package:analysis_server/src/services/completion/dart/suggestion_builder.dart';
|
|
import 'package:analyzer/dart/analysis/results.dart';
|
|
import 'package:analyzer/file_system/overlay_file_system.dart';
|
|
import 'package:analyzer/file_system/physical_file_system.dart';
|
|
import 'package:analyzer/src/dart/analysis/analysis_context_collection.dart';
|
|
import 'package:analyzer/src/test_utilities/test_code_format.dart';
|
|
import 'package:analyzer/src/util/performance/operation_performance.dart';
|
|
|
|
import 'sliding_statistics.dart';
|
|
|
|
/// A tool to see the current performance of code completion at an interesting
|
|
/// location. To see details, run it with `--observe:5000` and then use
|
|
/// DevTools CPU profiler.
|
|
///
|
|
/// Currently this is not a tool to track performance, it does not record it
|
|
/// anywhere.
|
|
///
|
|
/// Update the marked code as necessary to construct a case for checking
|
|
/// performance. The code below is just one example that we saw to have
|
|
/// significant cost.
|
|
///
|
|
/// Don't forget to update [flutterPackagePath].
|
|
Future<void> main() async {
|
|
await _runForever(
|
|
path: '$flutterPackagePath/lib/test.dart',
|
|
markedCode: r'''
|
|
import 'package:flutter/widgets.dart';
|
|
Widget x = ^;
|
|
''',
|
|
);
|
|
}
|
|
|
|
const String flutterEnvironmentPath =
|
|
'/Users/scheglov/dart/flutter_elements/environment';
|
|
|
|
/// This should be the path of the `package:flutter` in a local checkout.
|
|
/// You don't have to use [flutterEnvironmentPath] from above.
|
|
const String flutterPackagePath = '$flutterEnvironmentPath/packages/flutter';
|
|
|
|
Future<void> _runForever({
|
|
required String path,
|
|
required String markedCode,
|
|
}) async {
|
|
var code = TestCode.parse(markedCode);
|
|
var offset = code.position.offset;
|
|
|
|
var resourceProvider = OverlayResourceProvider(
|
|
PhysicalResourceProvider.INSTANCE,
|
|
);
|
|
|
|
resourceProvider.setOverlay(path, content: code.code, modificationStamp: -1);
|
|
|
|
var collection = AnalysisContextCollectionImpl(
|
|
resourceProvider: resourceProvider,
|
|
includedPaths: [path],
|
|
sdkPath: '/Users/scheglov/Applications/dart-sdk',
|
|
);
|
|
var analysisContext = collection.contextFor(path);
|
|
var analysisSession = analysisContext.currentSession;
|
|
var unitResult = await analysisSession.getResolvedUnit(path);
|
|
unitResult as ResolvedUnitResult;
|
|
|
|
var dartRequest = DartCompletionRequest.forResolvedUnit(
|
|
resolvedUnit: unitResult,
|
|
offset: offset,
|
|
);
|
|
|
|
var statistics = SlidingStatistics(100);
|
|
while (true) {
|
|
var timer = Stopwatch()..start();
|
|
var budget = CompletionBudget(Duration(seconds: 30));
|
|
List<CompletionSuggestionBuilder> suggestions = [];
|
|
for (var i = 0; i < 10; i++) {
|
|
suggestions =
|
|
await DartCompletionManager(
|
|
budget: budget,
|
|
notImportedSuggestions: NotImportedSuggestions(),
|
|
).computeSuggestions(
|
|
dartRequest,
|
|
OperationPerformanceImpl('<root>'),
|
|
maxSuggestions: -1,
|
|
useFilter: false,
|
|
);
|
|
}
|
|
|
|
var responseTime = timer.elapsedMilliseconds;
|
|
statistics.add(responseTime);
|
|
if (statistics.isReady) {
|
|
print(
|
|
'[${DateTime.now().millisecondsSinceEpoch}]'
|
|
'[time: $responseTime ms][mean: ${statistics.mean.toStringAsFixed(1)}]'
|
|
'[stdDev: ${statistics.standardDeviation.toStringAsFixed(3)}]'
|
|
'[min: ${statistics.min.toStringAsFixed(1)}]'
|
|
'[max: ${statistics.max.toStringAsFixed(1)}]',
|
|
);
|
|
} else {
|
|
print('[time: $responseTime ms][suggestions: ${suggestions.length}]');
|
|
}
|
|
}
|
|
}
|