Boost::serialization problem when use archive in a loop
I have a problem with serialization, and I do not know how to solve it. Time to serialize the class a lot of growing when I do it in a loop. The first iteration takes about 40 ms, for example, but any other takes about 400 ms. class NODE { public: NODE(){} NODE* add(NODE* node) { children.push_back(node); return node; } ~NODE() { for(vector<NODE*>::const_iterator it = children.begin(); it != children.end(); ++it) { delete *it; } } vector<NODE*> children; private: friend class boost::serialization::access; template <typename Archive> void serialize(Archive &ar, const unsigned int version) { ar & children; } }; void save(NODE* main) { std::ofstream stream("test", std::ios::binary); boost::archive::binary_oarchive oa(stream, boost::archive::no_header); oa << main; } int main() { boost::timer t; NODE* main(new NODE()); for (int i=0; i<2000;i++) { NODE* subnode = main->add( new NODE()); for (int k=0; k<20; k++) subnode->add( new NODE()); } for (int i=0; i<4; i++) { t.restart(); save(main); cout<<"serialize: "<<t.elapsed()<<endl; } delete main; return 0; } -- View this message in context: http://boost.2283326.n4.nabble.com/Boost-serialization-problem-when-use-arch... Sent from the Boost - Users mailing list archive at Nabble.com.
Just to let you know, I do not see the same behavior (I have cleaned up the code and added the header files). Here is the compilation command and output I get:
g++ test.cpp -otest -lboost_serialization ./test serialize: 0.11 serialize: 0.12 serialize: 0.11 serialize: 0.11 serialize: 0.12 serialize: 0.11 serialize: 0.12 serialize: 0.11 serialize: 0.12 ...
/// BEGIN file: test.cpp #include <fstream> #include <iostream> #include <vector> #include <boost/archive/binary_oarchive.hpp> #include <boost/archive/binary_iarchive.hpp> #include <boost/serialization/vector.hpp> #include <boost/timer.hpp> using namespace std; using namespace boost; class NODE { public: NODE(){} NODE* add(NODE* node) { children.push_back(node); return node; } ~NODE() { vector<NODE*>::const_iterator it; for(it = children.begin(); it != children.end(); ++it) { delete *it; } } vector<NODE*> children; private: friend class serialization::access; template <typename Archive> void serialize(Archive &ar, const unsigned int version) { ar & children; } }; void save(NODE* main) { ofstream stream("archive.tmp", ios::binary); archive::binary_oarchive oa(stream, archive::no_header); oa << main; } int main() { timer t; NODE* main(new NODE()); for (int i=0; i<2000;i++) { NODE* subnode = main->add( new NODE()); for (int k=0; k<20; k++) { subnode->add( new NODE()); } } for (int i=0; i<100; i++) { t.restart(); save(main); cout<<"serialize: "<<t.elapsed()<<endl; } delete main; return 0; } /// EOF -- View this message in context: http://boost.2283326.n4.nabble.com/Boost-serialization-problem-when-use-arch... Sent from the Boost - Users mailing list archive at Nabble.com.
participants (2)
-
johann
-
mikesam