总览
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