Make LineSplitter much faster for common case

Avoiding the sync* function in the common case makes LineSplitter
50-100 times faster.

BUG=
R=floitsch@google.com

Review URL: https://codereview.chromium.org/1775683002 .
This commit is contained in:
Matthias Hausner 2016-03-08 10:49:18 -08:00
parent 1f8ea5448e
commit ab7eb43013

View file

@ -49,7 +49,29 @@ class LineSplitter extends Converter<String, List<String>> {
}
}
List<String> convert(String data) => split(data).toList();
List<String> convert(String data) {
List<String> lines = <String>[];
int end = data.length;
int sliceStart = 0;
int char = 0;
for (int i = 0; i < end; i++) {
int previousChar = char;
char = data.codeUnitAt(i);
if (char != _CR) {
if (char != _LF) continue;
if (previousChar == _CR) {
sliceStart = i + 1;
continue;
}
}
lines.add(data.substring(sliceStart, i));
sliceStart = i + 1;
}
if (sliceStart < end) {
lines.add(data.substring(sliceStart, end));
}
return lines;
}
StringConversionSink startChunkedConversion(Sink<String> sink) {
if (sink is! StringConversionSink) {