总览

Chronicle Wire旨在在简化开发和加快调试方面获得文本协议的好处,但能够在不更改代码的情况下切换到性能更高且更小的二进制协议。

在这篇文章中 ,我研究了使用基于YAML的文本格式进行序列化,反序列化可能会实现的性能。 不错的功能之一是您可以使用YAML进行测试,调试,但在有意义的地方切换到Binary YAML。

甚至可以在单个流中混合和匹配。 例如,当您确定两端兼容时,使用YAML进行握手,并切换到Binary YAML甚至其他格式。

代码是什么样的?

首先,您需要有一个要写入的缓冲区。 这可以是一个byte [],一个ByteBuffer,堆外内存,甚至可以是从其他库中获得的地址和长度。

// Bytes which wraps a ByteBuffer which is resized as needed.
Bytes<ByteBuffer> bytes = Bytes.elasticByteBuffer();

现在,您可以选择要使用的格式。 由于连线格式本身是无缓冲的,因此可以将它们与相同的缓冲区一起使用,但是通常使用一种连线格式会更容易。

Wire wire = new TextWire(bytes);
// or
Bytes<ByteBuffer> bytes2 = Bytes.elasticByteBuffer();
Wire wire2 = new BinaryWire(bytes2);
// or
Bytes<ByteBuffer> bytes3 = Bytes.elasticByteBuffer();
Wire wire3 = new RawWire(bytes3);

有很多选项,例如您是否想要像protobuf或SBE这样的数字字段,还是要使用可变(最小)或固定长度(最快)的数据值。

要写出一个对象,可以使它成为可编组对象,并定义一个readmarshallable和writeMarshallable对象,但是现在让我们只写一些数据即可。
使用TextWire可以打印:

wire.write(() -> "message").text("Hello World").write(() -> "number").int64(1234567890L).write(() -> "code").asEnum(TimeUnit.SECONDS).write(() -> "price").float64(10.50);
System.out.println(bytes);
// to obtain the underlying ByteBuffer to write to a Channel
ByteBuffer byteBuffer = bytes2.underlyingObject();
byteBuffer.position(0);
byteBuffer.limit(bytes2.length());

但是,请改用BinaryWire并写入(以十六进制打印时):

message: Hello World
number: 1234567890
code: SECONDS
price: 10.5

但是,请改用BinaryWire并写入(以十六进制打印时):

00000000 C7 6D 65 73 73 61 67 65  EB 48 65 6C 6C 6F 20 57 ·message ·Hello W
00000010 6F 72 6C 64 C6 6E 75 6D  62 65 72 A3 D2 02 96 49 orld·num ber····I
00000020 C4 63 6F 64 65 E7 53 45  43 4F 4E 44 53 C5 70 72 ·code·SE CONDS·pr
00000030 69 63 65 90 00 00 28 41                          ice···(A

使用BinaryWire的大小可能是其一半,速度是其两倍,但是我们可以选择使用RawWire,它会删除所有元数据,并且可以比计划文本快8倍。

  • 有关更多示例和文档,请参阅《编年史》的主要自述文件。 使用编年史线的其他例子 。

结论

尽管二进制协议可以更快,但使用起来却困难得多。 如果可以使用文本格式,则可以更快地开发和调试,但是如果可以选择动态切换,则可以在需要时选择性能。

即使TextWire花费不到5微秒的时间,在99.99%的写入时间中读取6个字段对象,对于许多应用程序而言,这可能也足够快。

有用的是,如果需要,可以选择加快运行速度。 RawWire在99.99%的时间内不到600纳秒,而无需更改代码。

如果需要最大速度,我们有一个带精简API的BytesMarshallable接口,在99.99%的时间内不到220纳秒。

翻译自: https://www.javacodegeeks.com/2015/08/wiring-yaml-to-a-file-or-network-with-chronicle-wire.html

使用Chronicle Wire将YAML连接到文件或网络相关推荐

  1. 【Python】识别.yaml/.ini/.xml文件

    文章目录 一.[Python]识别.yaml/.ini/.xml文件: 1.1.模块的安装: 1.2..yaml文件读取: 1.3.yaml文件写入: 1.4.yaml文件更新操作: 1.5..ini ...

  2. OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作

    OpenCV学习笔记(四):XML,YAML(.txt,.doc)文件读写操作 一.Write_XML_and_YAML_File(写入XML) #include <opencv2/opencv ...

  3. 如何在报表控件FastReport.NET中连接XLSX 文件作为数据源?

    本文主要介绍如何在FastReport.NET中用一个插件来连接XLSX 文件作为数据源. FastReport.NET官方版下载 若要使用它,必须首先生成项目: С:\Program Files ( ...

  4. 项目经验之:针对昨日FDO连接SDF文件报错,国外GIS论坛给出了一个思路.帮助我过关.

    针对C#通过FDO连接SDF文件出现如下错误解决方案: "外部组件发生异常" 在一遍国外论坛上看到这样一句话: 看到吗,跟我上面所发生的一个样错误的提示:那又如何解决呢,是什么原因 ...

  5. 项目经验之:针对昨日FDO连接SDF文件报错,国个GIS论坛给出了一个思路.帮助我过关.

    针对C#通过FDO连接SDF文件出现如下错误解决方案:  "外部组件发生异常" 在个遍国外论坛上看到这样一句话: 看到吗,跟我上面所发生的一个样错误的提示:那又如何解决呢,是什么原 ...

  6. android蓝牙传文件,安卓手机怎样使用蓝牙连接传输文件

    首先要打开手机的蓝牙功能,平常大家不用蓝牙的时候一般处于关闭状态,需要的时候才开启,这样比较省电不是~~ 步骤一:打开蓝牙 打开蓝牙于两种方法,一种是通过快捷方式,比如桌面的蓝牙开关等以及状态栏的下拉 ...

  7. PHP连接.mdb文件

    PHP连接.mdb文件 大家好,今天介绍一下PHP连接.mdb文件 记得我学习这个的时候遇到了好多bug,将经验分享给大家 现在PHP+Access真的不多,如果没有特殊需求,其实还是MySQL和Ma ...

  8. excel怎么连接html文件夹,excel如何批量超链接到指定的文件夹,看完你就知道了...

    在我们平时做excel文件时,一列的数据往往会对应有附件,但是我们只能通过手动的方式进行超链接的连接,本篇文章教你使用一个函数即可批量完成. 工具/材料 excel 操作方法 01 了解函数 在这篇实 ...

  9. Linux-centos安装MySQL8.0.22连接驱动文件mysql-connector-java-8.0.22-1.el7.noarch.rpm

    目录 1.下载地址 2.选择版本 3.安装驱动 1.下载地址 https://downloads.mysql.com/archives/c-j/ 2.选择版本 选择对应的版本,这里系统选择Redhat ...

最新文章

  1. 以可读写可追加的方式显示系统时间
  2. python tornado websocket_python tornado websocket 多聊天室(返回消息给部分连接者)
  3. 永久代内存java_Java8内存模型—永久代(PermGen)和元空间(Metaspace)
  4. 流媒体服务器 客户端播放器方案推荐
  5. 教你50招提升ASP.NET性能(十五):解决性能问题时不要低估UI的价值
  6. html之四种方法导入css...
  7. 两个线程同时从服务器接收消息_一文看懂I/O多路复用技术(mysql线程池)
  8. HBase环境搭建60010端口无法访问问题解决方案
  9. GDataDate 的本地时间转换
  10. Win10如何使用命令释放IP和重新获取新IP
  11. 陀螺仪、加速计、磁力计等传感器汇总
  12. 普通路由器DMZ主机设置及访问方法
  13. conda删除环境 显示cannot remove current environment. deactivate and run conda remove again
  14. 当你在搜索框按下enter的一刹那发生了什么?
  15. [CSP-S模拟测试]:砍树(数学+模拟)
  16. 初创企业该追求盈利还是高估值
  17. turtle画图实现阿根廷足球
  18. Sql执行平时都很快但是偶尔就会很慢
  19. C# AssemblyInfo.cs文件的作用
  20. 本地idea 调试Hadoop的mr任务(Windows环境)以及对应安装包的下载

热门文章

  1. ssm使用全注解实现增删改查案例——DeptMapperImpl
  2. React中判断已完成的个数
  3. js 时间戳转换成时间_JavaScript 时间戳转成日期格式
  4. java本地监听zk服务器节点【动态上下线】
  5. follow 开源项目关于NoClassDefFoundError错误的解决方法
  6. 不同特权级间代码段的跳转{ 门 + 跳转(jmp + call) + 返回(ret) }
  7. 一篇文章指明做JavaWeb项目需要的前置知识+完整项目初解读(萌新必看,十分友好)
  8. MySQL优化(二):索引的类型、匹配原则、创建原则
  9. HttpClient 4 API –获取状态代码-getStatusLine()。getStatusCode()示例
  10. istio api_Istio的网络API解释了