0

現在、複雑な CGAL オブジェクト インスタンスを別のプロセスに転送する方法をいくつか調査しています。別の投稿で、カスタム アロケーターについて質問しましたが、別の方法は文字列ストリームです。(参考までに、共有メモリはオプションではありません)

現在の CGAL::Nef_polyhedron_3 は iostreaming を提供します:

// In main process
Nef_polyhedron_3 NP3;
stringstream ss;
ss << NP3;
sendToOtherProcess(ss.str());

// In separate process
stringstream ss(stringFromOtherProcess);
Nef_polyhedron_3 NP3;
ss >> NP3;

現在、出力ストリーミングは遅く、入力ストリーミングは 4 倍遅くなっています。

その理由は(私は推測していますが)すべてのキャスティングです。それを行うクラスはここにあります: https://github.ugent.be/divhaere/cgal/blob/master/include/CGAL/Nef_3/SNC_io_parser.h

クラスのメンバーの 1 つのスニペットを取得するには (ln 1481):

  in >> hx >> hy >> hz >> hw;
  vh->point() = Point_3(hx,hy,hz,hw);

何千ものポイントに対してそれを行うには時間がかかります。出力側では高速です(正確な理由はわかりません)

すべてのキャストを行わない、ある種のバイナリ ストリームを提供する方法はありますか? read()、write() を使用してバイナリの任意のストリームに書き込むことができることは承知していますが、CGAL SNC_io_parser.h を (簡単に) 変更することはできません。理想的には、ストリーミングを要求されたときに (いずれかの方法で) バイナリで実行されるストリームを提供できるようにしたいと考えています。

感謝して受け取った助け。

マルコス

4

1 に答える 1

1

その理由は(私が推測している)すべてのキャスティングです...何千ものポイントに対してそれを行うには時間がかかります。出力側では高速です(正確な理由はわかりません)

どこで時間が費やされているかを確実に判断できるように、プロファイラーで実行することをお勧めします。

すべてのキャストを行わない、ある種のバイナリ ストリームを提供する方法はありますか?

std::ostream算術型をテキストとの間でシリアル化するwithoperator<<()およびstd::istreamwithインターフェイスを使用しておりoperator>>()、この動作を変更することはできません。

のシリアル化関数を複製してNef_polyhedron_3、バイナリ形式との間でシリアル化する他のストリーム タイプを受け入れるようにすることができます。

于 2013-03-28T15:06:38.503 に答える