网站一般怎么维护企业的网站建设费用
news/
2025/9/22 21:11:33/
文章来源:
网站一般怎么维护,企业的网站建设费用,广州网络科技公司有哪些,品牌设计机构公司字节数组转为二进制数 c#低延迟系统需要高性能的消息处理和传递。 由于在大多数情况下#xff0c;数据必须通过有线传输或序列化才能保持持久性#xff0c;因此编码和解码消息已成为处理管道的重要组成部分。 高性能数据编码的最佳结果通常涉及应用程序数据细节的知识。 本文… 字节数组转为二进制数 c# 低延迟系统需要高性能的消息处理和传递。 由于在大多数情况下数据必须通过有线传输或序列化才能保持持久性因此编码和解码消息已成为处理管道的重要组成部分。 高性能数据编码的最佳结果通常涉及应用程序数据细节的知识。 本文介绍的技术是一个很好的示例说明了如何利用数据的某些方面在延迟和空间复杂度方面都有利于编码。 通常高频交易系统周围传递的最大消息以订单簿摘录的形式表示某种交换状态。 即典型的市场数据报价消息包含标识工具的信息和代表订单簿顶部的一组值。 数据集的强制性成员是以实数表示的价格/汇率信息用于买卖双方。 从优化的角度来看使该数据集非常有趣的原因是 单调的 低方差 非负* 因此在实践中我们处理的是浮点数集这些浮点数不仅经过排序升序出价和降价要求而且相邻值彼此相对“接近”。 请记住消息处理延迟对于大多数交易系统而言至关重要因此市场行情波动因为关键实体之一需要尽可能高效地传递。 让我演示如何利用所有这些功能将数字数据编码为非常紧凑的二进制形式。 首先两个前导图说明了不同序列化方法之间的差异 到目前为止我们可以看到与基于标准ByteBuffer的序列化相比增量编码在编码时间上可获得更好的结果但是一旦数组长度超过40它就会比Kryo 最流行的高性能序列化库之一更差。不过在这里重要的是一个典型的用例场景对于高频交易市场消息恰好适合阵列长度的10-40 当我们检查生成的消息大小作为数组长度的函数时它会变得更加有趣 此时应用增量编码的好处将变得显而易见蓝色曲线同样适用于字节缓冲区和Kryo序列化。 这里发生的是在掌握了一些有关要处理的数据的特定知识之后可以安全地进行假设从而导致序列化占用更多的CPU资源但是在空间方面却要荒唐得多。 增量压缩背后的想法非常简单。 让我们从一个整数数组开始 [85103、85111、85122、85129、85142、85144、85150、85165、85177] 如果这些是整数则不进行任何压缩就必须使用4 * 9 36字节来存储数据。 在这组数字中特别有趣的是它们彼此相对紧密地聚集在一起。 我们可以通过引用第一个值轻松地减少存储数据所需的字节数然后生成一个对应的增量数组 参考85103[8、19、26、39、41、47、62、74] 哇 现在我们可以缩小为字节数组。 让我们再次进行计算。 我们需要4个字节作为参考值仍为int每个增量 8 * 1个字节 12个字节。 与原始的36个字节相比这是一个很大的改进但仍有一些优化的余地。 与其从参考值计算增量不如依次存储每个前任的差异 参考85103[8、11、7、13、2、6、15、12] 结果是一组具有低方差和标准偏差的非单调数字。 我希望事情已经明确了。 尽管如此还是值得详细说明。 至此我们最终得到的是一组二进制编码的理想选择。 对于我们的示例这仅意味着可以在单个字节中容纳2个增量。 我们只需要一个半字节4位即可容纳0-15范围内的值因此我们可以轻松地最终将原始数组压缩为4供参考 8 * 1/2 8个字节。 由于价格是用十进制数字表示的因此应用带有二进制编码的增量压缩将涉及建立最大支持的精度并将小数作为整数将它们乘以10 ^精度从而使精度为6的1.12345678成为1123456整数。 到目前为止所有这些都是纯粹的理论推测本文开头有一些预告片。 我想这是演示如何使用2个非常简单的类在Java中实现这些想法的恰当时机。 我们将从编码方面开始 package eu.codearte.encoder;import java.nio.ByteBuffer;import static eu.codearte.encoder.Constants.*;public class BinaryDeltaEncoder {public static final int MAX_LENGTH_MASK ~(1 (LENGTH_BITS - 1));public ByteBuffer buffer;public double[] doubles;public int[] deltas;public int deltaSize, multiplier, idx;public void encode(final double[] values, final int[] temp, final int precision, final ByteBuffer buf) {if (precision 1 PRECISION_BITS) throw new IllegalArgumentException();if ((values.length MAX_LENGTH_MASK) ! values.length) throw new IllegalArgumentException();doubles values; deltas temp; buffer buf;multiplier Utils.pow(10, precision);calculateDeltaVector();if (deltaSize DELTA_SIZE_BITS) throw new IllegalArgumentException();buffer.putLong((long) precision (LENGTH_BITS DELTA_SIZE_BITS) | (long) deltaSize LENGTH_BITS | values.length);buffer.putLong(roundAndPromote(values[0]));idx 1;encodeDeltas();}private void calculateDeltaVector() {long maxDelta 0, currentValue roundAndPromote(doubles[0]);for (int i 1; i doubles.length; i) {deltas[i] (int) (-currentValue (currentValue roundAndPromote(doubles[i])));if (deltas[i] maxDelta) maxDelta deltas[i];}deltaSize Long.SIZE - Long.numberOfLeadingZeros(maxDelta);}private void encodeDeltas() {if (idx doubles.length) return;final int remainingBits (doubles.length - idx) * deltaSize;if (remainingBits Long.SIZE || deltaSize Integer.SIZE) buffer.putLong(encodeBits(Long.SIZE));else if (remainingBits Integer.SIZE || deltaSize Short.SIZE) buffer.putInt((int) encodeBits(Integer.SIZE));else if (remainingBits Short.SIZE || deltaSize Byte.SIZE) buffer.putShort((short) encodeBits(Short.SIZE));else buffer.put((byte) encodeBits(Byte.SIZE));encodeDeltas();}private long encodeBits(final int typeSize) {long bits 0L;for (int pos typeSize - deltaSize; pos 0 idx deltas.length; pos - deltaSize)bits | (long) deltas[idx] pos;return bits;}private long roundAndPromote(final double value) {return (long) (value * multiplier .5d);}
} 在详细介绍之前请先介绍几句话。 该代码不是完整的成熟的解决方案。 它的唯一目的是演示提高应用程序序列化协议的某些位的难易程度。 由于它受到了微基准测试因此它也不会引起gc压力因为即使是最快的次要gc的影响也会严重扭曲最终结果从而使api变得丑陋。 该实现也是次优的尤其是在CPU方面但是证明微优化不是本文的目标。 话虽如此让我们看看它的作用大括号中的行号。 编码方法首先进行一些基本的健全性检查{17,18}计算将十进制转换为整数{20}所使用的乘数并计算calculateDeltaVector。 这又有两个作用。 通过将小数转换为整数从前任减去最后将结果存储在临时数组{33}中计算整个集合的滚动增量 作为副作用得出表示增量{34,36}所需的最大位数 然后encode方法存储正确反序列化所需的一些元数据。 它以位为单位打包精度增量大小并以前64位{24}打包数组长度。 然后它存储参考值{25}并启动二进制编码{27}。 编码增量执行以下操作 检查它是否已经处理了所有数组条目如果已退出则退出{40} 计算要编码的剩余位数{41} 选择最合适的类型给定大小以位为单位对剩余的位进行编码然后将这些位写入缓冲区{43-46} 递归{47} 最后一点可能需要详细说明是encodeBits方法本身。 根据在参数中传递的类型大小以位为单位它循环一个临时long其唯一目的是充当位集并写入代表从long值的最高有效部分到最低有效部分的连续增量的位范围为字号。 正如预期的那样解码与编码完全相反并且主要是关于使用元数据来重建原始double数组直至达到指定的精度 package eu.codearte.encoder;import java.nio.ByteBuffer;import static eu.codearte.encoder.Constants.DELTA_SIZE_BITS;
import static eu.codearte.encoder.Constants.LENGTH_BITS;public class BinaryDeltaDecoder {private ByteBuffer buffer;private double[] doubles;private long current;private double divisor;private int deltaSize, length, mask;public void decode(final ByteBuffer buffer, final double[] doubles) {this.buffer buffer; this.doubles doubles;final long bits this.buffer.getLong();divisor Math.pow(10, bits (LENGTH_BITS DELTA_SIZE_BITS));deltaSize (int) (bits LENGTH_BITS) 0x3FFFFFF;length (int) (bits 0xFFFFFFFF);doubles[0] (current this.buffer.getLong()) / divisor;mask (1 deltaSize) - 1;decodeDeltas(1);}private void decodeDeltas(final int idx) {if (idx length) return;final int remainingBits (length - idx) * deltaSize;if (remainingBits Long.SIZE) decodeBits(idx, buffer.getLong(), Long.SIZE);else if (remainingBits Integer.SIZE) decodeBits(idx, buffer.getInt(), Integer.SIZE);else if (remainingBits Short.SIZE) decodeBits(idx, buffer.getShort(), Short.SIZE);else decodeBits(idx, buffer.get(), Byte.SIZE);}private void decodeBits(int idx, final long bits, final int typeSize) {for (int offset typeSize - deltaSize; offset 0 idx length; offset - deltaSize)doubles[idx] (current ((bits offset) mask)) / divisor;decodeDeltas(idx);}} 带有一些测试类的源代码可以在这里找到。 请记住即使事实证明该代码可以正常工作也不适合生产。 您绝对可以使它工作而无需临时数组用聪明的方法代替最大数组大小时替换全数组扫描或者通过进行倒数近似除以重量级除法就可以摆脱困境。 随意选择这些提示或应用不同的微优化并构建自己的专有增量编码协议。 对于对延迟敏感的交易应用程序而言它具有很大的区别可将液体工具的市场数据消息大小减小20-30倍。 当然如果切换到增量压缩二进制编码会对您的应用程序生态系统带来任何价值那么您必须弄清楚自己。 随便发表评论与您的发现 参考 如何从Fast的 JCG合作伙伴 Wojciech Kudla 获得一个带有字节的双精度数组的序列化二进制delta编码用于低差单调浮点数据集 。 快点。 怪胎的博客。 翻译自: https://www.javacodegeeks.com/2014/01/how-to-serialize-an-array-of-doubles-with-a-byte-binary-delta-encoding-for-low-varianced-monotonic-sets-of-floating-point-data.html字节数组转为二进制数 c#
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910386.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!