为什么 Python 在文件读/写操作方面比 Dart 快得多?

问题描述 投票:0回答:1

我正在测试 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 相似甚至更好,所以我对这些结果感到困惑。我在具有相似代码结构的同一系统上运行这两个测试,以确保公平的比较。 (苹果机)

问题:

  1. Python 和 Dart 之间的文件处理性能存在显着差异,是否有任何已知原因?
  2. Python 或 Dart 中的特定库、编码格式或其他系统级因素是否会影响文件 I/O 速度?
  3. Dart 中是否有优化技术来提高文件读写性能?

对于可能导致这种差异的原因以及如何优化 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();
}

谢谢!

python dart
1个回答
0
投票

缓冲I/O:Python的文件处理过程是缓冲的,在磁盘访问(RAM)之前在内存中积累数据。 Dart 的同步 I/O(writeSync 和 readSync)缺乏缓冲,导致每次磁盘访问的开销更大,从而降低大数据的性能。

系统库和编码:Python 使用符合 POSIX 标准的平台优化库,可提高 macOS 上的 I/O 效率。 Dart 的库可能缺乏这样的优化,以及默认的 UTF-8 编码或换行符差异( 与 )可能会增加 Dart 中的处理开销。

Dart 的同步 I/O 会增加延迟,因为每个操作都需要等待完成。 Dart 的异步 I/O 是非阻塞的,允许重叠操作并可以提高大文件的速度。

© www.soinside.com 2019 - 2024. All rights reserved.