字节数组转为二进制数 c#
低延迟系统需要高性能的消息处理和传递。 由于在大多数情况下,数据必须通过有线传输或序列化才能保持持久性,因此编码和解码消息已成为处理管道的重要组成部分。 高性能数据编码的最佳结果通常涉及应用程序数据细节的知识。 本文介绍的技术是一个很好的示例,说明了如何利用数据的某些方面在延迟和空间复杂度方面都有利于编码。
通常,高频交易系统周围传递的最大消息以订单簿摘录的形式表示某种交换状态。 即,典型的市场数据(报价)消息包含标识工具的信息和代表订单簿顶部的一组值。 数据集的强制性成员是以实数表示的价格/汇率信息(用于买卖双方)。
从优化的角度来看,使该数据集非常有趣的原因是:
- 单调的
- 低方差
- 非负*
因此,在实践中,我们处理的是浮点数集,这些浮点数不仅经过排序(升序出价和降价要求),而且相邻值彼此相对“接近”。 请记住,消息处理延迟对于大多数交易系统而言至关重要,因此市场行情波动,因为关键实体之一需要尽可能高效地传递。
让我演示如何利用所有这些功能将数字数据编码为非常紧凑的二进制形式。 首先,两个前导图说明了不同序列化方法之间的差异:
到目前为止,我们可以看到,与基于标准ByteBuffer的序列化相比,增量编码在编码时间上可获得更好的结果,但是一旦数组长度超过40,它就会比Kryo (最流行的高性能序列化库之一)更差。不过,在这里重要的是一个典型的用例场景,对于高频交易,市场消息恰好适合阵列长度的10-40
当我们检查生成的消息大小(作为数组长度的函数)时,它会变得更加有趣:
此时,应用增量编码的好处将变得显而易见(蓝色曲线同样适用于字节缓冲区和Kryo序列化)。 这里发生的是,在掌握了一些有关要处理的数据的特定知识之后,可以安全地进行假设,从而导致序列化占用更多的CPU资源,但是在空间方面却要荒唐得多。 增量压缩背后的想法非常简单。 让我们从一个整数数组开始:
- [85103、85111、85122、8