2

同じ文字列 (ログ メッセージなど) を複数のストリームに送信する必要があります。
次の解決策のうち、最も効率的なのはどれですか?

  1. ストリームごとに同じ文字列を再構築し、それをストリーム自体に送信します。

    outstr1 << "abc" << 123 << 1.23 << "def" << endl;  
    outstr2 << "abc" << 123 << 1.23 << "def" << endl;  
    outstr3 << "abc" << 123 << 1.23 << "def" << endl;  
    
  2. 文字列の演算子で一度文字列を構築し、それをすべてのストリームに送信します。

    std::string str = "abc" + std::to_string(123) + std::to_string(1.23) + "def";  
    outstr1 << str;  
    outstr2 << str;  
    outstr3 << str;  
    
  3. ストリームで文字列を 1 回作成し、それをすべてのストリームに送信します。

    std::stringstream sstm;  
    sstm << "abc" << 123 << 1.23 << "def" << endl;  
    std::string str = sstm.str();  
    outstr1 << str;  
    outstr2 << str;  
    outstr3 << str;  
    

これらの出力ストリームの一部またはすべてが RAM ディスク上にある可能性があります。

同じことを行う他の方法はありますか?

4

3 に答える 3

5

私はティー出力ストリームを使用します。次のようにします (疑似コード):

allstreams = tee(outstr1, outstr2, outstr3);
allstreams << "abc" << 123 << 1.23 << "def" << endl;

これを行うための標準の c++ ライブラリには何もないようですが、Boost には.

出力ストリームを作成するにはどうすればよいですか?への回答も参照してください。

于 2012-09-15T23:59:59.023 に答える
3

どちらの方法でも大きな違いが見られる可能性は低いですが1、オプション #3 が最も妥当に思えます。最初のオプションとは異なり、ints をstrings に複数回変換することはありません。string2 番目のオプションとは異なり、中間結果のために複数のオブジェクトを割り当てたり削除したりしません2。また、読みやすさの観点からも最もきれいに見えます。コードが重複しておらず、出力は連結ではなく、出力のように見えます。


1プロファイリングが悪である前に、最適化に関する必須の免責事項をここに挿入します。

2 小さな文字列の最適化は、それがサポートされているシステムでは役立つかもしれませんが (ありがとう、Prætorian )、中間オブジェクトのコンストラクターとデストラクタの呼び出しはなくなりません。

于 2012-09-15T23:55:28.190 に答える
2

このようなことを行う「適切な」方法は、複数の宛先に書き込むストリーム バッファを用意し、このストリーム バッファをstd::ostream. この方法では、コードは一度だけ書いているように見えますが、文字は複数回送信されます。「teebuf Dietmar」を検索すると、同じテーマのいくつかのバリエーションが見つかります。

あなたの質問にもコメントするには: 3 つの選択肢のどれが最も速いかは、あなたが持っている正確な式によって異なります。

  1. 関連する式を評価し、変換を 3 回実行する必要があります。実際に何をするかにもよりますが、これはまだかなり速いかもしれません。
  2. は実際に複数のストリームを作成および破棄し、 に対して複数の割り当てを行いstd::stringます。これが最も遅いと思います。
  3. それでもストリーム(実際には である必要がありますstd::ostringstream)を作成し、メモリを割り当てます。あなたのオプションのうち、私はそれが最速であると期待しています。

teebuf少なくとも、バッファリングを行い、バッファとストリーム バッファ ポインタの配列の両方に固定 suze 配列のみを使用する場合は、a を使用するのがおそらく最速です。sync()ただし、タイムリーにバッファを処理するにはオーバーライドする必要があることに注意してください。

実際のパフォーマンスを判断するには、測定する必要があります。

于 2012-09-16T00:03:13.967 に答える