c++ - 最快的 C++ 序列化?

标签 c++ serialization

我正在为 c++ 寻找一种非常快速的二进制序列化技术。我只需要序列化对象中包含的数据(没有指针等)。我希望它尽可能快。如果它是特定于 x86 硬件的,那是可以接受的。

我熟悉执行此操作的 C 方法。作为测试,我已经对几种技术进行了基准测试。我发现 C 方法比我实现的最佳 C++ 方法快 40%。

关于如何改进 C++ 方法(或执行此操作的库)的任何建议?内存映射文件有什么好的吗?

// c style writes
{
   #pragma pack(1)
   struct item
   {
      uint64_t off;
      uint32_t size;
   } data;
   #pragma pack

   clock_t start = clock();

   FILE* fd = fopen( "test.c.dat", "wb" );
   for ( long i = 0; i < tests; i++ )
   {
      data.off = i;
      data.size = i & 0xFFFF;
      fwrite( (char*) &data, sizeof(data), 1, fd );
   }
   fclose( fd );

   clock_t stop = clock();

   double d = ((double)(stop-start))/ CLOCKS_PER_SEC;
   printf( "%8.3f seconds\n", d );
}

大约 1.6 秒的测试 = 10000000

// c++ style ofstream writes

// define a DTO class
class test
{
public:
   test(){}

   uint64_t off;
   uint32_t size;

   friend std::ostream& operator<<( std::ostream& stream, const test& v );
};

// write to the stream
std::ostream& operator<<( std::ostream &stream,  const test& v )
{
   stream.write( (char*)&v.off, sizeof(v.off) );
   stream.write( (char*)&v.size, sizeof(v.size) );
   return stream;
}

{
   test data;

   clock_t start = clock();

   std::ofstream out;
   out.open( "test.cpp.dat", std::ios::out | std::ios::trunc | std::ios::binary );
   for ( long i = 0; i < tests; i++ )
   {
      data.off = i;
      data.size = i & 0xFFFF;
      out << data;
   }
   out.close();

   clock_t stop = clock();

   double d = ((double)(stop-start))/ CLOCKS_PER_SEC;
   printf( "%8.3f seconds\n", d );
}

大约 2.6 秒的测试 = 10000000

最佳答案

只有 非常 几个现实生活中的案例很重要。您只会序列化以使您的对象与某种外部资源兼容。磁盘、网络等。在资源上传输序列化数据的代码总是比序列化对象所需的代码慢几个数量级。如果您将序列化代码的速度提高一倍,那么您的整体操作速度不会超过 0.5%,无论是给予还是接受。这既不值得冒险也不值得付出努力。

测量三遍,切割一次。

关于c++ - 最快的 C++ 序列化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3637581/

相关文章:

django - 如何序列化 API 响应(在 JSON 中)并在 Django Rest Framework 中修改和添加字段?

java - 创建您自己的 Serialized 接口(interface)来保存对象的状态

java - java中的双序列化和长序列化

Scala 从字符串表示中获取类类型

c++ - 将对象插入 std::map 时构造函数中变量的地址

c++ - 库被杀死时自动删除库创建的文件

c++ - CMake:从 cpp 文件自动生成 c-wrapper 文件

c++ - 如何为 WinApi ldap_search_s 初始化 PZPWSTR (wchar_t**) 参数?

c++ - 3D vector 的角度 - 获得两者

c# - 为什么要从 Windows Phone 中删除 [Serializable] 属性?