7f8e6f8bb6
Benchmarks have shown that old-style for-loops are faster than for-in for instance. Golem says ia32 whole stack (i.e. including utf8 and change to VariableIndexer) AstToBinaryP90 (Intel Core i5) 6.617% (0.4 noise) AstToBinary (Intel Xeon) 5.158% (0.4 noise) AstToBinaryP90 (Intel Xeon) 5.104% (0.4 noise) AstToBinaryP50 (Intel Xeon) 5.148% (0.4 noise) AstToBinary (Intel Core i5) 6.579% (0.4 noise) AstToBinaryP50 (Intel Core i5) 6.741% (0.4 noise) by itself (i.e. compared to a build with utf8 and change to VariableIndexer) AstToBinaryP90 (Intel Core i5) 0.7724% (0.0 noise) AstToBinaryP50 (Intel Core i5) 0.7848% (0.0 noise) AstToBinary (Intel Core i5) 0.8559% (0.0 noise) AstToBinaryP90 (Intel Xeon) 0.7730% (0.1 noise) AstToBinaryP50 (Intel Xeon) 0.8195% (0.1 noise) AstToBinary (Intel Xeon) 0.9319% (0.1 noise) x64 whole stack (i.e. including utf8 and change to VariableIndexer) AstToBinaryP90 (Intel Core i5) 5.555% (0.2 noise) AstToBinaryP50 (Intel Xeon) 6.352% (0.4 noise) AstToBinaryP50 (Intel Core i5) 5.395% (0.5 noise) AstToBinary (Intel Xeon) 6.928% (0.5 noise) AstToBinaryP90 (Intel Xeon) 7.180% (0.5 noise) AstToBinary (Intel Core i5) 5.824% (0.5 noise) by itself (i.e. compared to a build with utf8 and change to VariableIndexer) AstToBinaryP90 (Intel Core i5) 0.1039% (0.0 noise) AstToBinaryP50 (Intel Core i5) 0.6154% (0.0 noise) AstToBinary (Intel Core i5) 0.7640% (0.1 noise) AstToBinaryP50 (Intel Xeon) 1.268% (0.1 noise) AstToBinary (Intel Xeon) 1.457% (0.1 noise) AstToBinaryP90 (Intel Xeon) 1.512% (0.1 noise) Change-Id: If091a3a01f2fe6574712946a01644413033739b6 Reviewed-on: https://dart-review.googlesource.com/c/85341 Commit-Queue: Jens Johansen <jensj@google.com> Reviewed-by: Peter von der Ahé <ahe@google.com>
65 lines
2.1 KiB
Dart
65 lines
2.1 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:kernel/ast.dart';
|
|
import 'package:kernel/binary/ast_to_binary.dart';
|
|
|
|
/// Writes libraries that satisfy the [predicate].
|
|
///
|
|
/// Only the referenced subset of canonical names is indexed and written,
|
|
/// so we don't waste time indexing all libraries of a component, when only
|
|
/// a tiny subset is used.
|
|
class LimitedBinaryPrinter extends BinaryPrinter {
|
|
final LibraryFilter predicate;
|
|
|
|
/// Excludes all uriToSource information.
|
|
///
|
|
/// By default the [predicate] above will only exclude canonical names and
|
|
/// kernel libraries, but it will still emit the sources for all libraries.
|
|
/// filtered by libraries matching [predicate].
|
|
// TODO(sigmund): provide a way to filter sources directly based on
|
|
// [predicate]. That requires special logic to handle sources from part files.
|
|
final bool excludeUriToSource;
|
|
|
|
LimitedBinaryPrinter(
|
|
Sink<List<int>> sink, this.predicate, this.excludeUriToSource)
|
|
: super(sink, includeSources: !excludeUriToSource);
|
|
|
|
@override
|
|
void computeCanonicalNames(Component component) {
|
|
for (var library in component.libraries) {
|
|
if (predicate(library)) {
|
|
component.root
|
|
.getChildFromUri(library.importUri)
|
|
.bindTo(library.reference);
|
|
library.computeCanonicalNames();
|
|
}
|
|
}
|
|
}
|
|
|
|
@override
|
|
bool shouldWriteLibraryCanonicalNames(Library library) {
|
|
return predicate(library);
|
|
}
|
|
|
|
void writeLibraries(Component component) {
|
|
for (int i = 0; i < component.libraries.length; ++i) {
|
|
Library library = component.libraries[i];
|
|
if (predicate(library)) writeNode(library);
|
|
}
|
|
}
|
|
|
|
@override
|
|
void writeNode(Node node) {
|
|
if (node is Library && !predicate(node)) return;
|
|
super.writeNode(node);
|
|
}
|
|
|
|
@override
|
|
void writeComponentIndex(Component component, List<Library> libraries) {
|
|
var librariesToWrite = libraries.where(predicate).toList();
|
|
super.writeComponentIndex(component, librariesToWrite);
|
|
}
|
|
}
|