私の場合は、次のとおりです。C++のstd ::にstringstreamオペレーションの最適化を次のように
- 私はSTDとから読んでいるバイナリファイルを持っている:: fstreamのは、(のchar *)としての動作を読ん
- 私の目標でありますファイル、進フォーマット済みのすべてのバイトを取り、その後、変数文字列に追加する
- さんが言わせて、例えば2
項目ごとにフォーマットされたファイルの内容全体を保持する必要がある文字列変数私は次のビンを持っています進ファイルの内容:
D0 46 98 57 A0 24 99 56 A3
次のように私は、各バイトの書式を設定しています方法は次のとおりです。
stringstream fin;;
for (size_t i = 0; i < fileb_size; ++i)
{
fin << hex << setfill('0') << setw(2) << static_cast<uint16_t>(fileb[i]);
}
// this would yield the output "D0469857A0249956A3"
return fin.str();
アプローチ上記期待通りに動作します、しかし、それはあります私が理解している大容量のファイルでは非常に遅いです。 stringstreamは入力フォーマット用です!
私の質問は、そのようなコードを最適化する方法はあるのでしょうか?私の唯一の制約は、上記のように出力が文字列形式であることです。
ありがとうございます。
iostreamsは効率を考慮して設計されていません。特定のユースケースでは、ネイティブ実装固有のファイルI/Oに勝ることはできません。あるいは、悪い場合には、Cの 'FILE *'を取り出して、手作業で最適化された16進変換コードをロールバックします。効率化のためにそれを打つことはできませんでした。ロケット科学ではありません。少なくとも私がCとC++を学んだ時代には、これは典型的な宿題でした:16進数を読み、それを変換します。 –
「非常に遅い」と比較して何か? –
出力文字列の[予約サイズ](https://stackoverflow.com/q/1941064/995714)を試しましたか?あなたはすでに入力のサイズを知っているので、出力のサイズを簡単に計算し、配列を何度も再割り当てすることは避けてください。 –