最快的C++序列化?

2024-04-14

我正在寻找一种非常快速的 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


仅有very现实生活中很少有案例表明这一点很重要。您只会进行序列化以使您的对象与某种外部资源兼容。磁盘、网络等。在资源上传输序列化数据的代码总是比序列化对象所需的代码慢几个数量级。如果将序列化代码的速度提高两倍,那么总体操作的速度不会超过 0.5%,不管怎样。这既不值得冒风险,也不值得付出努力。

测量三次,切割一次。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

最快的C++序列化? 的相关文章

  • 金特 + XNA (C#)

    是否可以使用jint http jint codeplex com操作使用 XNA C 创建的 3D 环境 并向该环境添加功能 再次使用 jint 作为 Jint 的贡献者 我会推荐你Jint http jint codeplex com
  • 在 C# 中使用“using”关键字避免多次处置的最佳实践

    当变量是 IDisposable 时 我们有using关键字来管理处置 但是如果我们在方法中返回值怎么办 using twice StringContent stringToStringContent string str using St
  • JSON.Net 反序列化返回“null”

    我正在使用 JSON Net 反序列化 JSON 字符串 JSON 字符串是 string testJson Fruits Apple color red size round Orange Pro
  • 如何使用 ASP.NET MVC 编辑多选列表?

    我想编辑一个如下所示的对象 我希望用 UsersGrossList 中的一个或多个用户填充 UsersSelectedList 使用 mvc 中的标准编辑视图 我只得到映射的字符串和布尔值 下面未显示 我在 google 上找到的许多示例都
  • C free() 是如何工作的? [复制]

    这个问题在这里已经有答案了 可能的重复 malloc 和 free 如何工作 https stackoverflow com questions 1119134 how malloc and free work include
  • XPATH 查询、HtmlAgilityPack 和提取文本

    我一直在尝试从名为 tim new 的类中提取链接 我也得到了解决方案 给出了解决方案 片段和必要的信息here https stackoverflow com questions 2982862 extracting a table ro
  • 叮当错误?命名空间模板类的朋友

    以下代码在 clang 下无法编译 但在 gcc 和 VS 下可以编译 template
  • 异常堆栈跟踪不显示抛出异常的位置

    通常 当我抛出异常 捕获它并打印出堆栈跟踪时 我会看到抛出异常的调用 导致该异常的调用 导致该异常的调用that 依此类推回到整个程序的根 现在它只向我显示异常所在的调用caught 而不是它所在的地方thrown 我不明白是什么改变导致了
  • 如果 JSON.NET 中的值为 null 或空格,则防止序列化

    我有一个对象需要以这样的方式序列化 即 null 和 空白 空或只是空格 值都不会序列化 我不控制对象本身 因此无法设置属性 但我知道所有属性都是字符串 环境NullValueHandling显然 忽略 只能让我找到解决方案的一部分 它 似
  • 静态类与类的实例

    我有一个静态类 用于访问我的公共属性 整个应用程序的全局属性 和我在应用程序运行期间使用的方法 例如 我在静态类中设置了一些属性 并且在应用程序运行时我可以从属性中获取值 但我可以使用单例模式创建非静态类并以相同的方式使用它 问题 对于我的
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 如何使用递归查找数字中的最小元素 [C]

    好的 所以我正在准备我的 C 考试 当谈到递归时我有点卡住了我是大学一年级的学生 这对我来说似乎有点困难 练习要求在给定的数字中使用递归函数我需要找到最小的元素 例如 52873 是 2 程序需要打印 2 include
  • 时间:2019-03-17 标签:c++fstream并发访问

    如果从不同的进程 线程同时访问文件会发生什么 据我所知 没有锁定文件的标准方法 只有操作系统特定的功能 就我而言 文件将被经常读取而很少写入 现在如果A打开一个文件进行读取 ifstream 并开始读取块 和B打开相同的文件进行写入 ofs
  • doxygen c++:记录由“using”声明公开的私有继承成员

    作为一个例子 我有以下课程 class A public void methodOne class B private A public Brief description using A methodOne 我还没有找到强制 doxyge
  • C 中使用 getrandom 实现随机浮点数

    我试图生成一个介于 0 和 1 之间的随机浮点数 无论是在 0 1 还是 0 1 对我来说都不重要 网上关于此的每个问题似乎都涉及rand 呼叫 播种time NULL 但我希望能够每秒多次调用我的程序 并每次都获得不同的随机数 这引导我找
  • Linq.Select() 中的嵌套表达式方法调用

    I use Select i gt new T 每次手动点击数据库后将我的实体对象转换为 DTO 对象 以下是一些示例实体和 DTOS 用户实体 public partial class User public int Id get set
  • 如何将 int 作为“void *”传递给线程启动函数?

    我最初有一个用于斐波那契变量数组的全局变量 但发现这是不允许的 我需要进行基本的多线程处理并处理竞争条件 但我无法在 pthread 创建中将 int 作为 void 参数提供 我尝试过使用常量指针 但没有成功 由于某些奇怪的原因 void
  • 无法识别解决方案文件夹中的 Visual Studio 2017 Nuget.config

    我在使用 Visual Studio 2017 时遇到问题 新的解决方案不断引用 C Users yopa AppData Roaming NuGet Nuget config 中意外位置的 Nuget config 文件 我已将 nuge
  • 使用 C# 动态创建按钮并按预定义的顺序放置它们

    NET 4 5 C 创建 Windows 窗体 我想动态创建和添加按钮并为其分配单击事件 但希望它们以特定的方式动态放置 就像图像一样 我的问题是如何以上述方式动态放置按钮 即 4x4 格式 一行 4 个按钮 4 列 但行数不受限制 是否可
  • 嵌入式二进制资源 - 如何枚举嵌入的图像文件?

    我按照中的说明进行操作这本书 http www apress com book view 9781430225492 关于资源等的章节 我不太明白的是 如何替换它 images Add new BitmapImage new Uri Ima

随机推荐

  • 如何使用标准 MVC Core 依赖注入解析未注册类型

    有没有办法得到IServiceProvider GetService
  • 如何在 matplotlib 中的另一个图上添加一个图?

    我有两个包含数据的文件 datafile1 和 datafile2 第一个始终存在 第二个仅有时存在 因此 datafile2 上的数据图被定义为我的 python 脚本中的函数 geom macro 在 datafile1 上的数据绘制代
  • Visual Studio 忽略 try catch - 仅调试

    我认为错误处理是个好主意 调试时它可能会妨碍 特别是对于用户友好的消息 在 VB6 中 我只需选中编译器的一个框即可忽略我的错误处理 我found https stackoverflow com questions 893277 is th
  • Mediator/EventAggregator 差异

    另外 当我需要在松散耦合的对象之间进行通信时 例如 MVVM的 ViewModel 有关最佳编程实践的不同书籍和博客建议使用 Mediator EventAggregator 模式 我的问题是关于这些模式之间的差异 关系 谁能为我描述一下它
  • 张量流自定义运算梯度

    我们想要在张量流中创建一个自定义层 因此 我们决定简单地从一个玩具示例开始 复制层 经过一番尝试和错误后 我们发现梯度似乎会传递正确的值 然而 在第二次迭代中 特征得到了 NAN 这可能是一个简单的错误 但目前我看不到它 总的来说 我有两个
  • 什么 Java 垃圾收集器清理 PermGen?

    垃圾收集者名单 串行GC 并行气相色谱 并行旧GC 浓缩标记扫描GC G1 GC 我知道当您启用 ClassUnloading JVM 选项时 Conc Mark Sweep GC 支持清理 PermGen 其他垃圾收集器是否支持清理 Pe
  • GitLab 管道 Docker 构建卡在 apk 上

    尝试创建一个简单的 GitLab 管道 为 Alpine Linux Openshift CLI 构建 Docker 镜像 这是代码 FROM frolvlad alpine glibc latest MAINTAINER Daniel W
  • 从嵌入的 SVG 设置 XSL FO 背景图像

    我正在创建背景文本withinXSL FO 文档是这样的
  • JQuery Mobile 刷新复选框仅有效一次 - .checkboxradio('refresh') 问题

    我遇到了一个奇怪的问题 我有一个带有复选框列的表格 我正在使用 JQuery Mobile 复选框 我希望单击一行与单击该行中的复选框相关联 JS document on pagecreate function event bindRowC
  • 如何在 Formidable (Node.js) 中取消用户上传?

    我已经研究这个问题两天了 但我被困住了 我正在使用 Node js 和 Express 并且正在尝试实现上传表单 基本上 我希望表单执行以下操作 检查文件的大小 如果太大则取消上传 当我说取消时 我的意思是防止任何进一步的数据写入磁盘并删除
  • Supervisor 3.3 与 Ubuntu 16.04 服务启动失败 [已关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 今天早上 我通过使用升级了我的主管 pip install upgrade supervisor from 3 2 to 3 3 但之后
  • Java中创建静态对象的目的是什么?

    class Demo void show System out println i am in show method of super class class Flavor1Demo An anonymous class with Dem
  • 使 GDI 绘图不可点击

    我有一个带有 GDI 绘图的透明 WinForms 应用程序 我将其用作覆盖层 问题是 每当我单击 GDI 绘图时 焦点就会转到应用程序窗口 我该如何扭转这种情况 您需要使用right颜色如TransparencyKey 一切使得Form
  • 如何在 RubyMine 中运行 Cucumber 场景大纲示例表的单行?

    我正在使用 RubyMine 运行测试 强加给我 我有一些使用场景大纲和示例格式的功能 有没有办法可以只运行示例表中的某一行 Example Examples user row row1 row2 1 2 4 51 51 97 98 98
  • Java Swing:将 JLabel 添加到 JPanel

    我只是想将 JLabel 添加到现有的 JPanel 中 这看起来很简单 我已经查遍了 我认为这是正确的 但标签没有出现在我的面板上 有人看到我缺少什么吗 谢谢 ResultsPanel myPanel new ResultsPanel p
  • 如何检查传递到 EC2 实例的用户数据是否正常工作

    在使用 EC2 命令行 API 创建新的 AWS EC2 实例时 我将一些用户数据传递到新实例 我如何知道该用户数据是否被执行 您可以使用以下步骤进行验证 启动 EC2 实例时使用 SSH Check the log of your use
  • CSS - 页面右侧的图像,文本未环绕在其周围

    这可能是一个简单的问题 但我无法弄清楚 我想使用 CSS 将图像放在页面的右侧 而不是在其周围环绕文本 我想要这样的 img text text text text text text text 如果我在图像上进行 float right
  • 为什么 android-inapp-billing-v3 库需要两次尝试购买?

    我正在尝试使用 android inapp billing v3 库在我的简单应用程序中实现应用内购买 我正在使用这个库 https github com anjlab android inapp billing v3 https gith
  • 根据“几个因素”斜率更改 ggplot 中的线条颜色

    更新 我有以下数据 我想根据 3 个因素 I II III 的斜率在组之间画一条线 set seed 205 dat data frame t rep c I II III each 10 pairs rep 1 10 3 value rn
  • 最快的C++序列化?

    我正在寻找一种非常快速的 C 二进制序列化技术 我只需要序列化对象中包含的数据 没有指针等 我希望它尽可能快 如果它特定于 x86 硬件 这是可以接受的 我熟悉执行此操作的 C 方法 作为测试 我对几种技术进行了基准测试 我发现 C 方法比