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