使用Chronicle Wire将YAML连接到文件或网络
總覽
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可以打印:
但是,請改用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连接到文件或网络的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 庐山旅游多少钱
- 下一篇: orm查询部分字段_ORM问题第2部分–