0d4b08caaa
Adding edits (e.g. via `dart fix --apply` are often done with `List.insert(0, whatnot)` which takes O(n) time. Here QueueList that can insert fast at both ends is used instead (and we use `addFirst` instead of `insert(0)`. On the example from https://github.com/feinstein/google-i18n-address-dart.git we go from: ``` $ time dart fix --use-aot-snapshot --apply [...] 249517 fixes made in 255 files. real 3m55.810s user 4m1.209s sys 0m3.714s (resetting) $ time dart fix --use-aot-snapshot --apply [...] 249517 fixes made in 255 files. real 3m33.966s user 3m37.588s sys 0m2.058s (resetting) $ time dart fix --use-aot-snapshot --apply [...] 249517 fixes made in 255 files. real 3m36.525s user 3m40.083s sys 0m1.907s ``` to: ``` $ time dart fix --use-aot-snapshot --apply [...] 249517 fixes made in 255 files. real 0m9.970s user 0m12.676s sys 0m2.100s (resetting) $ time dart fix --use-aot-snapshot --apply [...] 249517 fixes made in 255 files. real 0m9.862s user 0m12.926s sys 0m1.797s (resetting) $ time dart fix --use-aot-snapshot --apply [...] 249517 fixes made in 255 files. real 0m9.612s user 0m12.712s sys 0m1.834s ``` Statistics on the `real` runtime: ``` N Min Max Median Avg Stddev x 3 213.966 235.81 216.525 222.10033 11.941664 + 3 9.612 9.97 9.862 9.8146667 0.18363369 Difference at 95.0% confidence -212.286 +/- 19.1415 -95.581% +/- 8.61838% (Student's t, pooled s = 8.44503) ``` For `lsp_many_prefer_single_quotes_violations_benchmark.dart --sizes=3200`: Before from something like: ``` Initial analysis: 0.115654 First code action call: 0.835152 Subsequent action call 1: 0.538592 Subsequent action call 2: 0.561636 Select all code action call: 1.564402 ``` After to something like: ``` Initial analysis: 0.086985 First code action call: 0.411660 Subsequent action call 1: 0.171566 Subsequent action call 2: 0.193708 Select all code action call: 1.107339 ``` Statistics on 5 runs gives: First code action call: ``` Difference at 95.0% confidence -0.44381 +/- 0.0261597 -52.4602% +/- 3.09218% (Student's t, pooled s = 0.0179367) ``` Subsequent action call 1: ``` Difference at 95.0% confidence -0.381012 +/- 0.0195618 -69.9139% +/- 3.5895% (Student's t, pooled s = 0.0134128) ``` Subsequent action call 2: ``` Difference at 95.0% confidence -0.360077 +/- 0.0265277 -64.634% +/- 4.76173% (Student's t, pooled s = 0.0181891) ``` Select all code action call: ``` Difference at 95.0% confidence -0.405855 +/- 0.027662 -26.7277% +/- 1.82169% (Student's t, pooled s = 0.0189668) ``` Change-Id: I3868afaa8c32a24c01c3a52bd8a53d5e8e4e3afe Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/427401 Commit-Queue: Jens Johansen <jensj@google.com> Reviewed-by: Brian Wilkerson <brianwilkerson@google.com>
74 lines
2.7 KiB
Dart
74 lines
2.7 KiB
Dart
// Copyright (c) 2017, 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:analyzer_utilities/tools.dart';
|
|
import 'package:path/path.dart' as path;
|
|
|
|
import 'api.dart';
|
|
import 'codegen_dart_protocol.dart';
|
|
import 'from_html.dart';
|
|
import 'implied_types.dart';
|
|
|
|
GeneratedFile clientTarget(bool responseRequiresRequestTime,
|
|
CodegenUriConverterKind uriConverterKind) =>
|
|
GeneratedFile(
|
|
'../analysis_server_client/lib/src/protocol/protocol_common.dart',
|
|
(String pkgPath) async {
|
|
var visitor = CodegenCommonVisitor(path.basename(pkgPath),
|
|
responseRequiresRequestTime, uriConverterKind, readApi(pkgPath),
|
|
forClient: true);
|
|
return visitor.collectCode(visitor.visitApi);
|
|
});
|
|
|
|
GeneratedFile pluginTarget(bool responseRequiresRequestTime,
|
|
CodegenUriConverterKind uriConverterKind) =>
|
|
GeneratedFile('lib/protocol/protocol_common.dart', (String pkgPath) async {
|
|
var visitor = CodegenCommonVisitor(path.basename(pkgPath),
|
|
responseRequiresRequestTime, uriConverterKind, readApi(pkgPath));
|
|
return visitor.collectCode(visitor.visitApi);
|
|
});
|
|
|
|
/// A visitor that produces Dart code defining the common types associated with
|
|
/// the API.
|
|
class CodegenCommonVisitor extends CodegenProtocolVisitor {
|
|
final bool forClient;
|
|
|
|
/// Initialize a newly created visitor to generate code in the package with
|
|
/// the given [packageName] corresponding to the types in the given [api] that
|
|
/// are common to multiple protocols.
|
|
CodegenCommonVisitor(super.packageName, super.responseRequiresRequestTime,
|
|
super.uriConverterKind, super.api,
|
|
{this.forClient = false});
|
|
|
|
@override
|
|
void emitImports() {
|
|
writeln("import 'dart:convert' hide JsonDecoder;");
|
|
writeln();
|
|
writeln("import 'package:collection/collection.dart' show QueueList;");
|
|
writeln();
|
|
if (forClient) {
|
|
writeln(
|
|
"import 'package:analysis_server_client/src/protocol/protocol_internal.dart';");
|
|
} else {
|
|
writeln(
|
|
"import 'package:$packageName/src/protocol/protocol_internal.dart';");
|
|
writeln(
|
|
"import 'package:$packageName/src/utilities/client_uri_converter.dart';");
|
|
}
|
|
writeln();
|
|
writeln('// ignore_for_file: flutter_style_todos');
|
|
}
|
|
|
|
@override
|
|
List<ImpliedType> getClassesToEmit() {
|
|
var types = impliedTypes.values.where((ImpliedType type) {
|
|
var node = type.apiNode;
|
|
return node is TypeDefinition && node.isExternal;
|
|
}).toList();
|
|
types.sort((first, second) =>
|
|
capitalize(first.camelName).compareTo(capitalize(second.camelName)));
|
|
return types;
|
|
}
|
|
}
|