【问题标题】:How can I substitute a binary stream for a string stream, to avoid casting?如何用二进制流代替字符串流,以避免强制转换?
【发布时间】:2013-03-28 13:09:16
【问题描述】:

我目前正在研究一些将复杂的 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;

现在,输出流很慢,输入流慢了四倍。

原因(我猜)是所有的选角。可以在这里找到执行它的类:https://github.ugent.be/divhaere/cgal/blob/master/include/CGAL/Nef_3/SNC_io_parser.h

仅获取班级成员之一的 sn-p (ln 1481):

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

为数千个点执行此操作需要一段时间。在输出端它更快(不知道为什么)

有没有什么方法可以提供某种二进制流,而不是所有的转换?我知道可以使用 read()、write() 写入任何二进制流,但我不能(轻松)更改 CGAL SNC_io_parser.h。我想理想情况下,我希望能够提供一个流,当被要求流式传输(无论哪种方式)时,它都会以二进制形式进行。

感谢您的任何帮助。

马科斯

【问题讨论】:

    标签: c++ iostream stringstream steam


    【解决方案1】:

    原因(我猜)是所有的演员......为数千分做这件事需要一段时间。在输出端它更快(不知道为什么)

    您可能希望在分析器下运行它,以便能够确定地知道时间花在了哪里。

    有什么方法可以提供某种二进制流,而不是所有的转换?

    您将std::ostreamoperator&lt;&lt;()std::istreamoperator&gt;&gt;() 接口一起使用,这些接口将算术类型序列化为文本,并且无法更改此行为。

    您可以复制Nef_polyhedron_3 的序列化函数,并使其接受其他一些可以序列化为二进制格式的流类型。

    【讨论】:

    • +1 用于分析。如果正在进行真正的类型转换,那可能需要一些时间,但除非你测量它,否则你不知道这真的是问题所在。简单类型转换本身只是对编译器的建议,对性能根本没有任何影响。
    猜你喜欢
    • 2016-02-24
    • 2016-04-21
    • 2016-08-02
    • 2013-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-24
    相关资源
    最近更新 更多