[vm/corelib] Improve performance of list copying

With NNBD core libraries:
ListCopy.toList.100(RunTime) 4129 -> 2376 us.

With default core libraries:
ListCopy.toList.100(RunTime) 3006 -> 2140 us.

Issue: https://github.com/dart-lang/sdk/issues/40917
Change-Id: I7a319b6a150eeb5c4765c299dd45638bed2b4406
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/138720
Commit-Queue: Alexander Markov <alexmarkov@google.com>
Reviewed-by: Martin Kustermann <kustermann@google.com>
This commit is contained in:
Alexander Markov 2020-03-10 15:58:06 +00:00 committed by commit-bot@chromium.org
parent ec8941b189
commit 7e0139e0c0
2 changed files with 40 additions and 20 deletions

View file

@ -373,18 +373,28 @@ class _GrowableList<T> extends ListBase<T> {
}
List<T> toList({bool growable: true}) {
var length = this.length;
if (length > 0) {
List list = growable ? new _List(length) : new _List<T>(length);
for (int i = 0; i < length; i++) {
list[i] = this[i];
final length = this.length;
if (growable) {
if (length > 0) {
final list = new _List(length);
for (int i = 0; i < length; i++) {
list[i] = this[i];
}
final result = new _GrowableList<T>._withData(list);
result._setLength(length);
return result;
}
if (!growable) return list;
var result = new _GrowableList<T>._withData(list);
result._setLength(length);
return result;
return <T>[];
} else {
if (length > 0) {
final list = new _List<T>(length);
for (int i = 0; i < length; i++) {
list[i] = this[i];
}
return list;
}
return new List<T>(0);
}
return growable ? <T>[] : new List<T>(0);
}
Set<T> toSet() {

View file

@ -373,18 +373,28 @@ class _GrowableList<T> extends ListBase<T> {
}
List<T> toList({bool growable: true}) {
var length = this.length;
if (length > 0) {
final list = new _List<T>(length);
for (int i = 0; i < length; i++) {
list[i] = this[i];
final length = this.length;
if (growable) {
if (length > 0) {
final list = new _List(length);
for (int i = 0; i < length; i++) {
list[i] = this[i];
}
final result = new _GrowableList<T>._withData(list);
result._setLength(length);
return result;
}
if (!growable) return list;
final result = new _GrowableList<T>._withData(list);
result._setLength(length);
return result;
return <T>[];
} else {
if (length > 0) {
final list = new _List<T>(length);
for (int i = 0; i < length; i++) {
list[i] = this[i];
}
return list;
}
return List<T>.empty(growable: false);
}
return growable ? <T>[] : List<T>.empty(growable: growable);
}
Set<T> toSet() {