2

このアプリケーションには、文字を生成するクラスと、文字を消費する別のクラスがあります。現在の実装では、文字が生成されると動的に割り当てられ ( を使用)、消費されると文字がnew削除されます( を使用)。deleteこれはすべて非常に遅いため、その実装を置き換えてパフォーマンスを向上させる方法を検討しています。

私が必要とするセマンティックは、標準クラスのセマンティックですqueue: フロントでプッシュ、バックでポップ。デフォルトの実装はdequeIIRC を使用します。deque通常、メモリの「ブロック」または「チャンク」を使用して実装されるため、OS メモリ アロケータへの呼び出しがはるかに少なくなり、メモリの使用量がほとんど増えずに大幅なスピードアップが期待できます。

ただし、キューに入れられるデータは文字 (おそらくワイド文字) であるため、標準の入出力ストリーム クラス、つまり文字ストリームを使用することもできますstringstream。私の知る限り、彼らの行動もキューのようです。

先験的により良い選択はありますか?両方のクラスに同様の割り当てパターンがありますか? 両方のパフォーマンスを試して測定することはできますが、実際には問題ではなく、どちらでも十分です。その場合、どれが最も使いやすく/安全ですか?

二次的な問題は、プロデューサーとコンシューマーの間の同時実行性です。アクセスをシーケンシャル (同じスレッド上) に制限することはできますが、現在のマルチコア ハードウェアでは、スレッド セーフな実装がパフォーマンスの面で有益である可能性があります。

私が飛び込んでコーディングを始める前に、あなたの知恵に感謝します。

4

2 に答える 2

1

私は何年も前にこれを読みました (私はそれをもう一度読んだことはありませんでした)。彼らが破産する前に愚かなお金を要求し始める前に、彼らが実際に私に雑誌を送っていたときです:-)。

これは役立つかもしれません

http://www.drdobbs.com/parallel/lock-free-queues/208801974

余談ですが、私は財務データを処理するリアルタイム システムに取り組んでいます。通常、固定長のキューを使用し、消費者が処理できない場合はキューに収まらないデータを破棄します。古いデータは、欠落したデータよりも悪いものです。もちろん、要件は異なる場合があります。

于 2012-10-03T01:28:56.123 に答える
1

std::stringstream文字を読み取っても消費されないため、キューではありません。seekg(0)同じ文字を簡単にもう一度読むことができます。したがって、書き込めば書くほど、より多くのメモリを消費します。

固執しstd::queueます。基本的な実装としてのデフォルトの選択はstd::deque、ほぼ確実に正しいものです。

同時実行性に関してはstd::queue、他のスレッドが読み取りまたは書き込みを行っているときに書き込みを行うことは、まったく安全ではありません。効率的なブロッキング キューの実装が必要な場合は、その目的のために特別に構築されたものを作成または借用する必要があります。

于 2012-10-03T01:40:22.693 に答える