0

SOでこの投稿を読んでいました:

https://stackoverflow.com/a/3183607/997112

これは、C++ と C# の間のパフォーマンスに関する質問への回答です。ポスターは高周波トレーディングのバックグラウンドを持っており、ナノ秒の節約を求めて HF 作業用の独自のクラス ライブラリを作成したと述べています。彼の投稿の中で、彼は C++ STL をほとんど使用していないと述べていますが、これには驚きました。

私の質問は、C++ STL はパフォーマンスに関して完全に最適化されているのでしょうか、それとも平均的なユーザー向けにのみ最適化されているのでしょうか? C のネイティブ配列にいくつかの関数をラップすることは、Vector や List と言うよりも速いでしょうか? ブースト内にパフォーマンスの高いコンテナはありますか?

これらのクラスは 99% のユーザーにとって十分高速であることを理解していますが、私の質問は残りの 1% 内での使用を対象としています。

4

3 に答える 3

6

この質問には、いくつかの理由から「STL が最適である」という回答はありません。

  1. STL の実装は少なくとも半ダースあり、最適化されていないものもあれば、最適化されているものもあります (ただし、次の項目を参照してください)。
  2. あなたが行うほとんどの最適化は、使用パターンに関する仮定を行い、一部の使用パターンについては悲観的になります。特定のユースケースを実際に最適化するには、何かがどのように使用されるかについての知識が必要です。
  3. ほとんどの STL ユーザーはコンポーネントを何らかの形で誤用しており、一部の適切な使用法は C++ 2011 でのみ実際にサポートされるようになりました (例: ローカル カスタム アロケーターの使用)。
  4. 人々が STL について話すとき、彼らは通常、アルゴリズムを搭載したコンテナの例を参照します。便利ではありますが、STL の焦点はアルゴリズムであり、これらは最適化される可能性がはるかに高くなります。結局のところ、STL の要点は、カスタム作成されたコンテナーでアルゴリズムを簡単に使用できることです! わざわざコンテナを最適化する必要はありません。ただし、項目 1 ~ 3 はアルゴリズムにも適用されることに注意してください。
  5. STL には優れた抽象化がありますが、完全に「存在する」わけではありません。特に、複数のアルゴリズムを組み合わせる場合、アルゴリズムを個別に適用するよりも優れたアプローチが存在しますが、STL インターフェイスは実際にはこれをサポートしていません。

とはいえ、典型的な最適化された STL 実装よりも優れたものを考え出すには、かなりの労力が必要です。たとえば、replace for を 1 日で書き、典型的な使用例(アロケータを適切に使用できる C++ 2011 バージョンを参照) ではstd::vector<T, A>高速であると主張する人からの主張に疑問を呈します。std::vector<T, A>

于 2012-11-28T00:19:10.143 に答える
2

実際に投稿を読んでみると、このビットが際立っています。

"空の場合にのみ同期するすべてのカスタム同期クラス、カスタム アロケータ、カスタム ロック フリー キューとリスト、時折の STL (カスタム アロケータを使用) ですが、より頻繁にカスタム侵入型コレクション (そのうちの重要なライブラリがあります) です。 "

STL は、読み取る複数のスレッドを処理するように設定されていますが、もちろん、複数のライターを処理するにはロックやその他の同期プリミティブが必要です。作成者がカスタム ロック フリー キューとリストを実際に作成した場合、ロックを使用した純粋な STL よりもパフォーマンスが大幅に向上する可能性があります。カスタム アロケータも同様にほぼ予想されますが、デフォルトstd::allocator<T>は「中道」タイプのソリューションであることが知られています。割り当てパターンによっては、メモリ プールでアロケータを使用すると、大幅な速度向上が得られる場合があります。

于 2012-11-28T00:34:22.210 に答える
2

C++03 では、コピーに関してかなり明白なパフォーマンスの問題がありましたが、C++11 ではムーブ セマンティクスと完全転送により修正されています。

この仕様では、すべての標準アルゴリズムの複雑さが定義されているため、すべての実装で特定のパフォーマンス動作を期待できます。

多くの場合、stdlib のパフォーマンスについて不満を言う人は、その仕事に間違ったツールを使用しており、アルゴリズムを改善する必要があるだけです。C++ は非常に多くのものを提供しますが、1 つのことがすべてに有効であるというふりをすることは決してありません。

stdlib コレクションに欠けていることがわかった 2 つのこと:

コレクションをプールまたはアリーナから割り当てたい場合。アロケーター (ステートフルであっても) は、すべての場合にゼロ オーバーヘッドでこれを行うのに十分なほど柔軟ではありません。

また、何かを実装する最も効率的な方法は、2 つのコレクションをマージすることです。キャッシュの例です。ルックアップと LRU にそれぞれ とunordered_mapをマージしたい場合があります。list標準コレクションでは、これはあまり効率的ではありません。

どちらの場合も、Boost Intrusive は必要な機能を提供します。

于 2012-11-28T00:24:20.317 に答える