我正在测试 Python 和 Dart 中的文件读/写性能,我遇到了一个令人惊讶的结果:对于这些操作,Python 明显快于 Dart。以下是我记录的时间:
Python:
Write time: 10.28 seconds
Read time: 4.88 seconds
Total time: 15.16 seconds
Dart:
Write time: 79 seconds
Read time: 10 seconds
Total time: 90 seconds
我预计 Dart 在这方面的表现与 Python 相似甚至更好,所以我对这些结果感到困惑。我在具有相似代码结构的同一系统上运行这两个测试,以确保公平的比较。 (苹果机)
问题:
对于可能导致这种差异的原因以及如何优化 Dart 的文件 I/O 性能,如果有任何见解或建议,我将不胜感激。
这是Python代码:
def benchmark(cnt=200):
block_size = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" * (1024 * 1024)
file_path = "large_benchmark_test.txt"
start_time = time.time()
with open(file_path, "w") as file:
for _ in range(cnt):
file.write(block_size)
write_end_time = time.time()
with open(file_path, "r") as file:
while file.read(1024):
pass
read_end_time = time.time()
write_time = write_end_time - start_time
read_time = read_end_time - write_end_time
total_time = read_end_time - start_time
print(f"Python - Write: {write_time:.2f} s")
print(f"Python - Read: {read_time:.2f} s")
print(f"Python - Total: {total_time:.2f} s")
os.remove(file_path)
Dart 代码:
void benchmark({int cnt=200}) {
final blockSize = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' * 1024 * 1024;
final filePath = 'large_benchmark_test.txt';
final file = File(filePath);
final writeStartTime = DateTime.now();
final sink = file.openSync(mode: FileMode.write);
for (int i = 0; i < cnt; i++) {
sink.writeStringSync(blockSize);
}
sink.closeSync();
final writeEndTime = DateTime.now();
final writeTime = writeEndTime.difference(writeStartTime).inSeconds;
print("Dart (Synch) - Write: $writeTime s");
final readStartTime = DateTime.now();
final reader = file.openSync(mode: FileMode.read);
while (true) {
final buffer = reader.readSync(1024);
if (buffer.isEmpty) break;
}
reader.closeSync();
final readEndTime = DateTime.now();
final readTime = readEndTime.difference(readStartTime).inSeconds;
final totalTime = readEndTime.difference(writeStartTime).inSeconds;
print("Dart (Synch) - Read: $readTime s");
print("Dart (Synch) - Total: $totalTime s");
file.deleteSync();
}
谢谢!
缓冲I/O:Python的文件处理过程是缓冲的,在磁盘访问(RAM)之前在内存中积累数据。 Dart 的同步 I/O(writeSync 和 readSync)缺乏缓冲,导致每次磁盘访问的开销更大,从而降低大数据的性能。
系统库和编码:Python 使用符合 POSIX 标准的平台优化库,可提高 macOS 上的 I/O 效率。 Dart 的库可能缺乏这样的优化,以及默认的 UTF-8 编码或换行符差异( 与 )可能会增加 Dart 中的处理开销。
Dart 的同步 I/O 会增加延迟,因为每个操作都需要等待完成。 Dart 的异步 I/O 是非阻塞的,允许重叠操作并可以提高大文件的速度。