C++ のパフォーマンスの最適化には、1. 動的割り当ての回避、2. コンパイラー最適化フラグの使用、4. アプリケーションのキャッシュ、5. 並列プログラミングなどのさまざまな手法が含まれます。最適化の実際のケースでは、整数配列内の最長の昇順サブシーケンスを見つけるときにこれらの手法を適用して、アルゴリズムの効率を O(n^2) から O(n log n) に改善する方法を示します。
C++ パフォーマンス最適化ガイド: コードの実行効率を向上させる秘訣をマスターしましょう
はじめに
C++ は、その速度と効率性で知られる強力なプログラミング言語です。いくつかの主要な最適化手法を実装することで、C++ コードのパフォーマンスを大幅に向上させることができます。この記事では、C++ のパフォーマンスの最適化について詳しく説明し、各手法を説明するための実践的な例を示します。
最適化テクノロジー
1. 動的割り当てと解放を避ける
メモリの動的割り当てと解放は、特に頻繁に実行される場合に非常に時間がかかります。動的メモリ管理のオーバーヘッドを避けるために、ローカル変数とスマート ポインタを使用するようにしてください。
// 动态分配 int* arr = new int[100]; delete[] arr; // 释放内存 // 智能指针(避免手动释放) std::unique_ptr<int[]> arr(new int[100]);
2. コンパイラ最適化フラグを使用する
コンパイラは、より高速なコードを生成するために使用できるさまざまな最適化フラグを提供します。これらのフラグをオンにすると、関数のインライン化、ループの最適化、コード生成の品質が向上します。
// GCC 编译器 g++ -O3 -Wall -std=c++17
3. データ構造を最適化する
特定のニーズに合ったデータ構造を選択することが重要です。たとえば、高速検索の場合は、線形検索の代わりにハッシュ テーブルを使用します。
// 哈希表(快速查找) std::unordered_map<int, int> myMap;
4. キャッシュテクノロジーを適用します
キャッシュは頻繁にアクセスされるデータを保存するため、負荷の高い計算や I/O 操作が回避されます。スマート ポインターまたは汎用コンテナーを使用してキャッシュを実装します。
// LRU 缓存(最近最少使用) class LRUCache { std::unordered_map<int, int> cache; std::list<int> lru; public: int get(int key) { ... } void put(int key, int value) { ... } };
5. 並列プログラミング
CPU を大量に使用するタスクの場合、マルチスレッド並列プログラミングを使用するとパフォーマンスが向上します。標準ライブラリは、スレッド化および同期プリミティブを提供します。
// 并行 for 循环 #include <thread> #include <vector> void parallel_sum(const std::vector<int>& arr, int* sum) { std::vector<std::thread> threads; int thread_count = std::thread::hardware_concurrency(); for (int i = 0; i < thread_count; i++) { threads.push_back(std::thread([=, &arr, &sum] { *sum += std::accumulate(&arr[i * arr.size() / thread_count], &arr[(i + 1) * arr.size() / thread_count], 0); })); } for (auto& thread : threads) thread.join(); }
実際のケース
ケース: 整数配列内の最長の昇順部分列を見つけます
// 未优化的算法(时间复杂度:O(n^2)) int longestSubsequence(const std::vector<int>& arr) { int maxLength = 0; for (int i = 0; i < arr.size(); i++) { for (int j = i + 1; j < arr.size(); j++) { if (arr[j] > arr[i]) maxLength = std::max(maxLength, j - i + 1); } } return maxLength; } // 优化后的算法(时间复杂度:O(n log n)) int longestSubsequence(const std::vector<int>& arr) { std::vector<int> tail(arr.size(), -1); int maxIndex = -1; for (int i = 0; i < arr.size(); i++) { // 二分搜索查找插入点 int l = 0, r = maxIndex; while (l < r) { int mid = (l + r) / 2; if (arr[tail[mid]] < arr[i]) l = mid + 1; else r = mid; } if (maxIndex < r) { if (r == 0) tail[0] = i; else tail[r] = i; maxIndex = r; } } return maxIndex + 1; }
二分探索を使用して再帰プロセスを最適化することにより、アルゴリズムの効率が O(n^2) からO(n log n)。
以上がC++ パフォーマンス最適化ガイド: コードをより効率的にする秘訣を発見します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。