-4

最近、C と C++ の速度の違いをいくつか見てきましたが、ある状況でどちらが速いかを判断するのは非常に予測不可能な場合があります。

STLが導入されて以来、大幅に簡素化されていることは知っていますが、速度/メモリコストで物事を簡素化しますか?

例えば、スタック/キュー/二分木/グラフなどをポインタ付きの構造体を使って定義する方法はいろいろあります。ただし、これらの実装はもう少し手間がかかります。これをすべて行うもう 1 つの方法は、テンプレートを使用して自由にサイズを増減できる STL のベクトルを使用することです。マップ、キューなどのために実装された多くのテンプレートもあります。

私の質問は、時間とメモリの複雑さの点でどの実装がより効率的だと思いますか?その理由は何ですか?

4

2 に答える 2

2

C++ 標準ライブラリが開発され、パフォーマンスのために微調整され、何年にもわたってデバッグされており、コンパイラの最適化が改善されているため、標準コンテナーからすぐに非常に優れたパフォーマンスを得ることができます。reserveおそらく最大のパフォーマンスのボトルネックは、メモリを取得するためにヒープに行くことです。これは、ベクトルの場合など、場合によっては削減できます。

C++ を作成している場合は、ソフトウェアのニーズに応じて、利用可能なすべてのコンテナーとアルゴリズムを使用してください。次に、パフォーマンスの問題がある場合は、コードをプロファイリングできます (ボトルネックはまだ標準ライブラリではありません)。

于 2012-12-27T17:11:08.003 に答える
0

ここで重要なのはもちろん、「押し付けがましい」ソリューションを使用する場合、つまり、リンクされたリストのリンクを各ノード内に保存する場合と、別のノード構造を保持する別の場所へのポインタ/参照を保持する場合とでは異なります。データ自体には、いくらかのパフォーマンスへの影響があります [そして、それは双方向で機能します - 侵入型のソリューションが常に最善であるとは限りません]。

人々が誤解する典型的なケースは、割り当てられたオブジェクトを何らかのコンテナーに格納することと、それをオブジェクトのコピーをコンテナーに格納するソリューションと比較する場合です。そのコンテナが再割り当てによって「成長」する必要がある場合、パフォーマンスの問題が発生します。しかし、それは単に「保存するものを選択するのが間違っている」または「このタイプのオブジェクトストレージのコンテナの種類が間違っている」だけです。

ほとんどの場合、何かを行う方法 (たとえば、ツリーかベクターか) を実装すると、100 倍の改善が得られます。このタイプのストレージに固有のものを書くと、元のコードがどれだけうまく書かれているか、最適化されたコードがどれだけうまく書かれているかに応じて、5 ~ 20% の改善が得られます。ゲームのレンダリング ループの内部の詳細、または OS カーネルのシェデュラーまたはメモリ割り当てコードの一部ではないと仮定すると、5% は持つ価値がなく、大多数のコードでは、おそらく 20% の改善が必要です。どちらもあまり価値がありません[システム機能の一部について-コンテナに物を保存している場合、単にコンテナを保存してコンテナのコンテンツを行ったり来たりするだけでなく、それ以上のことを行うことを願っていますよね?]

コードの最適化に時間を費やす前に、コードがどこで時間を費やしているかを適切に分析する必要があります。それからあなたはそれをより良くするために攻撃することができます. そのための最初のステップは、「ここでのアルゴリズムの動作は何ですか?」を調べることです。はるかに高速な別の方法を使用できる場合、何かの並べ替えに O(2^n) を費やしていますか? リスト、スタック、またはキューがおそらくより良い選択である場合、大きな配列への挿入/削除に時間を費やしていますか? 少数の大きなブロックを書き込むことができるのに、小さなデータのチャンクをディスクに書き込んでいますか?

これらの種類の質問は、実際の違いを生む 5、10、100 倍の改善を提供します。もちろん、何かの 5% を削ることは価値があります。場合によっては、0.5% オフにすることでゲームが 100 fps ではなく 200 fps で実行される場合、0.5% オフにする価値があります。しかし、一般的に、速度が少なくとも 2 倍にならない場合は、他の場所で時間を費やす必要があります。

于 2012-12-27T17:42:09.360 に答える