mirror of
https://github.com/dart-lang/sdk
synced 2024-09-16 00:39:49 +00:00
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:
parent
1f8ea5448e
commit
ab7eb43013
|
@ -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) {
|
||||
|
|
Loading…
Reference in a new issue