C++ I/O 操作を最適化してパフォーマンスを向上させるにはどうすればよいですか?

WBOY
リリース: 2024-05-08 17:21:01
オリジナル
780 人が閲覧しました

C++ I/O パフォーマンスを向上させるには、いくつかのアプローチがあります: バッファリングされた I/O を使用してデータをグループ化し、ディスク アクセスの数を減らします。 mmap() システム コールを使用してファイルをメモリに直接マップし、頻繁なディスク アクセスを回避します。並列 I/O を使用して、複数のスレッドまたはプロセスで同時に I/O 操作を実行し、スループットを向上させます。

如何优化C++ I/O操作以提高性能?

C++ I/O 操作を最適化してパフォーマンスを向上させる方法

I/O 操作はアプリケーションのパフォーマンスにとって重要です。 C++ では、I/O 操作を最適化してパフォーマンスを向上させる方法がいくつかあります。

1. バッファー付き I/O の使用

バッファー付き I/O では、データを大きなチャンクにグループ化し、ディスクに書き込みまたは読み取りを行います。これにより、ディスク アクセスの数が減少し、パフォーマンスが向上します。

#include <iostream>
#include <fstream>
#include <vector>

int main() {
  std::vector<int> data(1000000);
  std::ofstream file("data.bin", std::ios::binary);
  // 缓冲 1 MB 的数据
  file.rdbuf()->pubsetbuf(nullptr, 1024 * 1024);

  // 写入数据
  file.write((char*)&data[0], data.size() * sizeof(int));
  file.close();

  return 0;
}
ログイン後にコピー

2. mmap()

mmap() システムコールを使用すると、ファイルをメモリに直接マッピングできます。これにより、頻繁なディスク アクセスが回避され、パフォーマンスが向上します。

#include <sys/mman.h>
#include <fcntl.h>

int main() {
  // 打开文件
  int fd = open("data.bin", O_RDWR);
  // 将文件映射到内存
  void* data = mmap(nullptr, 1000000 * sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  
  // 操作数据
  ...

  // 取消映射
  munmap(data, 1000000 * sizeof(int));
  close(fd);

  return 0;
}
ログイン後にコピー

3. パラレル I/O の使用

パラレル I/O では、複数のスレッドまたはプロセスで I/O 操作を同時に実行します。これにより、スループットが向上し、全体の実行時間が短縮されます。

#include <thread>
#include <vector>

int main() {
  std::vector<std::thread> threads;
  for (int i = 0; i < 4; i++) {
    threads.emplace_back([] {
      // 执行 I/O 操作
    });
  }

  for (auto& thread : threads) {
    thread.join();
  }

  return 0;
}
ログイン後にコピー

実際的なケース

以下は、C++ を使用して I/O 操作を最適化する実際的なケースです。このプログラムは、ファイルから大量のデータを読み書きします:

#include <iostream>
#include <fstream>
#include <vector>
#include <chrono>

using namespace std;

int main() {
  // 数据量
  const int dataSize = 1000000;

  // 使用缓冲 I/O
  {
    vector<int> data(dataSize);
    ofstream file("data.bin", ios::binary);
    file.rdbuf()->pubsetbuf(nullptr, 1024 * 1024);

    // 记录时间
    auto start = chrono::high_resolution_clock::now();
    // 写入数据
    file.write((char*)&data[0], data.size() * sizeof(int));
    auto end = chrono::high_resolution_clock::now();

    // 计算执行时间
    auto duration = chrono::duration_cast<chrono::milliseconds>(end - start);
    cout << "Buffered I/O duration: " << duration.count() << " ms" << endl;
  }

  // 使用 mmap()
  {
    vector<int> data(dataSize);
    int fd = open("data.bin", O_RDWR);
    void* dataPtr = mmap(nullptr, dataSize * sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

    // 记录时间
    auto start = chrono::high_resolution_clock::now();
    // 写入数据
    memcpy(dataPtr, &data[0], data.size() * sizeof(int));
    auto end = chrono::high_resolution_clock::now();

    // 取消映射
    munmap(dataPtr, dataSize * sizeof(int));
    close(fd);

    // 计算执行时间
    auto duration = chrono::duration_cast<chrono::milliseconds>(end - start);
    cout << "mmap() duration: " << duration.count() << " ms" << endl;
  }

  return 0;
}
ログイン後にコピー

このプログラムを実行すると、mmap() を使用した方がバッファリングされた I/O よりも何倍も高速であることがわかります。

以上がC++ I/O 操作を最適化してパフォーマンスを向上させるにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート