<bdo id='Zl5eI'></bdo><ul id='Zl5eI'></ul>

<small id='Zl5eI'></small><noframes id='Zl5eI'>

    1. <tfoot id='Zl5eI'></tfoot>
    2. <i id='Zl5eI'><tr id='Zl5eI'><dt id='Zl5eI'><q id='Zl5eI'><span id='Zl5eI'><b id='Zl5eI'><form id='Zl5eI'><ins id='Zl5eI'></ins><ul id='Zl5eI'></ul><sub id='Zl5eI'></sub></form><legend id='Zl5eI'></legend><bdo id='Zl5eI'><pre id='Zl5eI'><center id='Zl5eI'></center></pre></bdo></b><th id='Zl5eI'></th></span></q></dt></tr></i><div id='Zl5eI'><tfoot id='Zl5eI'></tfoot><dl id='Zl5eI'><fieldset id='Zl5eI'></fieldset></dl></div>

      1. <legend id='Zl5eI'><style id='Zl5eI'><dir id='Zl5eI'><q id='Zl5eI'></q></dir></style></legend>

        提升 C++ 序列化开销

        时间:2023-10-06

      2. <tfoot id='owOQs'></tfoot><legend id='owOQs'><style id='owOQs'><dir id='owOQs'><q id='owOQs'></q></dir></style></legend>
        • <i id='owOQs'><tr id='owOQs'><dt id='owOQs'><q id='owOQs'><span id='owOQs'><b id='owOQs'><form id='owOQs'><ins id='owOQs'></ins><ul id='owOQs'></ul><sub id='owOQs'></sub></form><legend id='owOQs'></legend><bdo id='owOQs'><pre id='owOQs'><center id='owOQs'></center></pre></bdo></b><th id='owOQs'></th></span></q></dt></tr></i><div id='owOQs'><tfoot id='owOQs'></tfoot><dl id='owOQs'><fieldset id='owOQs'></fieldset></dl></div>

                <tbody id='owOQs'></tbody>
                  <bdo id='owOQs'></bdo><ul id='owOQs'></ul>
                • <small id='owOQs'></small><noframes id='owOQs'>

                  本文介绍了提升 C++ 序列化开销的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

                  问题描述

                  我正在尝试使用以下代码测量序列化开销

                  I'm trying to measure serialization overhead with following code

                      const int message_size=1000;
                  
                      std::vector<short> message(message_size);
                  
                      std::string s((char*)(&message[0]), message_size * sizeof(short));
                  
                      double size= 1000*sizeof(short);
                      double size2= s.size();
                      double overhead = size2 - size; //is zero
                  

                  正确吗?(这是从矢量序列化)

                  如何衡量序列化开销?- 主要问题是测量序列化向量.我可以使用 Boost 进行序列化.

                  How can I measure serialization overhead? - main problem is to measure serialized vector. I can use Boost for serialization.

                  推荐答案

                  这个通用的测试平台应该能让你做出决定:看它生活在 Coliru 上

                  This generic test bed should enable you to decide: see it Live On Coliru

                  #include <boost/archive/binary_oarchive.hpp>
                  #include <boost/archive/text_oarchive.hpp>
                  #include <boost/archive/xml_oarchive.hpp>
                  #include <boost/fusion/adapted/boost_tuple.hpp>
                  #include <boost/make_shared.hpp>
                  #include <boost/phoenix.hpp>
                  #include <boost/serialization/array.hpp>
                  #include <boost/serialization/shared_ptr.hpp>
                  #include <boost/serialization/string.hpp>
                  #include <boost/serialization/vector.hpp>
                  #include <boost/tuple/tuple.hpp>
                  #include <iostream>
                  #include <sstream>
                  
                  namespace detail
                  {
                      struct add_to_archive_f 
                      {
                          template <typename, typename> struct result { typedef void type; };
                          template <typename Archive, typename T> 
                              void operator()(Archive& ar, T const& t) const {
                                  ar << BOOST_SERIALIZATION_NVP(t);
                              }
                      };
                  
                      static const boost::phoenix::function<add_to_archive_f> add_to_archive { };
                  }
                  
                  template <typename Archive = boost::archive::binary_oarchive, typename... Data>
                  size_t archive_size(Data const&... data)
                  {
                      std::ostringstream oss;
                      Archive oa(oss);
                  
                      boost::fusion::for_each(boost::make_tuple(data...), 
                              detail::add_to_archive(
                                  boost::phoenix::ref(oa), 
                                  boost::phoenix::arg_names::arg1
                                  ));
                  
                      return oss.str().size();
                  }
                  
                  template <typename Archive = boost::archive::binary_oarchive, typename... Data>
                  void benchmark(Data const&... data)
                  {
                      std::cout << __PRETTY_FUNCTION__ << ":	" << archive_size<Archive>(data...) << "
                  ";
                  }
                  
                  struct Base {
                      boost::array<double, 1000> data;
                      virtual ~Base() {}
                  
                    private:
                      friend class boost::serialization::access;
                      template <typename Archive> void serialize(Archive& ar, unsigned /*version*/) {
                          ar & BOOST_SERIALIZATION_NVP(data);
                      }
                  };
                  
                  struct Derived : Base {
                      std::string x;
                      Derived() : x(1000, '') { }
                  
                    private:
                      friend class boost::serialization::access;
                      template <typename Archive> void serialize(Archive& ar, unsigned /*version*/) {
                          ar & boost::serialization::make_nvp("base", boost::serialization::base_object<Base>(*this));
                          ar & BOOST_SERIALIZATION_NVP(x);
                      }
                  };
                  

                  测试驱动程序:

                  template <typename Archive> 
                  void some_scenarios()
                  {
                      benchmark<Archive>(std::vector<char>(1000));
                      benchmark<Archive>(boost::make_shared<std::vector<char>>(1000));
                      benchmark<Archive>(3.14f, 42, 42ull, "hello world");
                      benchmark<Archive>(boost::make_shared<Base>());
                      benchmark<Archive>(boost::make_shared<Derived>());
                  }
                  
                  int main()
                  {
                      some_scenarios<boost::archive::binary_oarchive>();
                      some_scenarios<boost::archive::text_oarchive>();
                      some_scenarios<boost::archive::xml_oarchive>();
                  }
                  

                  我的 64 位 Ubuntu 和 Boost 1.55 的输出:

                  The output on my 64-bit Ubuntu with Boost 1.55:

                  void benchmark(const Data& ...) [with Archive = boost::archive::binary_oarchive; Data = {std::vector<char, std::allocator<char> >}]:    1052
                  void benchmark(const Data& ...) [with Archive = boost::archive::binary_oarchive; Data = {boost::shared_ptr<std::vector<char, std::allocator<char> > >}]:    1059
                  void benchmark(const Data& ...) [with Archive = boost::archive::binary_oarchive; Data = {float, int, long long unsigned int, char [12]}]:   76
                  void benchmark(const Data& ...) [with Archive = boost::archive::binary_oarchive; Data = {boost::shared_ptr<Base>}]: 8069
                  void benchmark(const Data& ...) [with Archive = boost::archive::binary_oarchive; Data = {boost::shared_ptr<Derived>}]:  9086
                  void benchmark(const Data& ...) [with Archive = boost::archive::text_oarchive; Data = {std::vector<char, std::allocator<char> >}]:  2037
                  void benchmark(const Data& ...) [with Archive = boost::archive::text_oarchive; Data = {boost::shared_ptr<std::vector<char, std::allocator<char> > >}]:  2043
                  void benchmark(const Data& ...) [with Archive = boost::archive::text_oarchive; Data = {float, int, long long unsigned int, char [12]}]: 92
                  void benchmark(const Data& ...) [with Archive = boost::archive::text_oarchive; Data = {boost::shared_ptr<Base>}]:   2049
                  void benchmark(const Data& ...) [with Archive = boost::archive::text_oarchive; Data = {boost::shared_ptr<Derived>}]:    3083
                  void benchmark(const Data& ...) [with Archive = boost::archive::xml_oarchive; Data = {std::vector<char, std::allocator<char> >}]:   16235
                  void benchmark(const Data& ...) [with Archive = boost::archive::xml_oarchive; Data = {boost::shared_ptr<std::vector<char, std::allocator<char> > >}]:   17307
                  void benchmark(const Data& ...) [with Archive = boost::archive::xml_oarchive; Data = {float, int, long long unsigned int, char [12]}]:  436
                  void benchmark(const Data& ...) [with Archive = boost::archive::xml_oarchive; Data = {boost::shared_ptr<Base>}]:    19393
                  void benchmark(const Data& ...) [with Archive = boost::archive::xml_oarchive; Data = {boost::shared_ptr<Derived>}]: 21508
                  

                  如你所见,

                  • XML 的开销相当大
                  • 对于二进制文件,对于许多不同(例如多态)小类型元素的小档案来说,开销变得很大

                  这篇关于提升 C++ 序列化开销的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持html5模板网!

                  上一篇:C++中如何实现序列化 下一篇:C++中double/float类型的二进制序列化的可移植性

                  相关文章

                  最新文章

                    <bdo id='Ala6p'></bdo><ul id='Ala6p'></ul>
                  <i id='Ala6p'><tr id='Ala6p'><dt id='Ala6p'><q id='Ala6p'><span id='Ala6p'><b id='Ala6p'><form id='Ala6p'><ins id='Ala6p'></ins><ul id='Ala6p'></ul><sub id='Ala6p'></sub></form><legend id='Ala6p'></legend><bdo id='Ala6p'><pre id='Ala6p'><center id='Ala6p'></center></pre></bdo></b><th id='Ala6p'></th></span></q></dt></tr></i><div id='Ala6p'><tfoot id='Ala6p'></tfoot><dl id='Ala6p'><fieldset id='Ala6p'></fieldset></dl></div>

                    <small id='Ala6p'></small><noframes id='Ala6p'>

                    1. <tfoot id='Ala6p'></tfoot>

                    2. <legend id='Ala6p'><style id='Ala6p'><dir id='Ala6p'><q id='Ala6p'></q></dir></style></legend>