如何在 Dart 中有效地迭代 stdin?



我今天为Linux编写了我的第一个Dart命令行实用程序。它应该处理通过 stdin(标准)传送到它的文件。最终,每行都会被处理。但我觉得我使用了一种非常低效的方式来读取文件,所以我希望得到一些提示。下面是代码的最小示例:

import 'dart:io';
void main(){
var line = stdin.readLineSync();
for (;line != null; line = stdin.readLineSync() ) {
//do stuff with line or simply
stdout.writeln(line);
}
}

然后像这样使用:

zcat some_data.csv.gz | ./my_dart_tool.exe > output_file.csv

这是在 Dart 中迭代 stdin 的合理方法,还是应该以不同的方式完成?

感谢您的任何帮助!

stdin.readLineSync的不良性能是一个已知问题,Dart SDK 问题跟踪器上存在 GitHub 问题:https://github.com/dart-lang/sdk/issues/45255

问题是Dart不想读取超过必要的数据,因此它尝试一次读取一个字节,直到找到换行符。这不是很有效,因为这增加了本机层和 Dart 代码之间的大量通信。

在解决此问题之前,解决方法是执行以下操作:

import 'dart:convert';
import 'dart:io';
void main() async {
await for (final line in stdin.transform(utf8.decoder).transform(const LineSplitter())) {
//do stuff with line or simply
print(line);
}
}

在这里,我们读取缓冲区内的一堆字节,然后用utf8.decode对其进行转换,然后将其发送到返回行的LineSplitter。这更有效,因为我们可以减少读取stdin的次数,因为我们每次请求数据时都会读取更多数据。

最新更新