Как я могу заменить двоичный поток строковым потоком, чтобы избежать кастинга?

В настоящее время я изучаю несколько способов передачи экземпляра сложного объекта 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

Возьмем только фрагмент одного из членов класса (ln 1481):

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

Выполнение этого для многих тысяч точек занимает некоторое время. На стороне вывода это быстрее (не уверен, почему именно)

Могу ли я каким-либо образом предоставить какой-то двоичный поток, который не будет выполнять все приведения? Я знаю, что можно писать в любой поток в двоичном виде с помощью read(), write(), но я не могу (легко) изменить CGAL SNC_io_parser.h. Я предполагаю, что в идеале я хотел бы иметь возможность предоставить поток, который, когда его просят передать (в любом случае), он делал это в двоичном виде.

Любая помощь принята с благодарностью.

Маркос


person Marcos Scriven    schedule 28.03.2013    source источник


Ответы (1)


Причина в том, что (я предполагаю) это все кастинг... Делать это для многих тысяч точек занимает некоторое время. На стороне вывода это быстрее (не уверен, почему именно)

Вы можете запустить его под профилировщиком, чтобы с уверенностью сказать, где тратится время.

Могу ли я каким-либо образом предоставить какой-то двоичный поток, который не будет выполнять все приведения?

Вы используете интерфейсы std::ostream с operator<<() и std::istream с operator>>(), которые сериализуют арифметические типы в текст и из текста, и это поведение нельзя изменить.

Вы можете реплицировать функции сериализации Nef_polyhedron_3 и заставить их принимать некоторые другие типы потоков, которые сериализуются в/из двоичных форматов.

person Maxim Egorushkin    schedule 28.03.2013
comment
+1 за профилирование. Если происходит реальное преобразование типов, это может занять некоторое время, но вы не узнаете, что это действительно проблема, пока не измерите ее. Простое приведение типов само по себе является просто советом для компилятора и никак не должно влиять на производительность. - person Caleb; 28.03.2013