.NET 性能优化的技巧
当伟大工具包括众所周知的字段(如int,Guid,string)时,代码天生器将直接插入对这些范例的手动编码编解码器的挪用,而不是挪用CodecProvider来检索该范例的IFieldCodec 在运行时专门化泛型范例 与上面相同,代码天生器可以天生在运行时行使专门化的代码。 预先计较常数值以消除某些分支 在序列化时代,每个字段都带有一个标头,凡是是一个字节。它会汇报解串器哪个字段是编码的。此字段问题包括3条信息:字段的规格(牢靠宽度、长度前缀、标志脱离、引用等),字段的模式范例(预期、众所周知、早年界说的、编码)用于多态,并将最后3位专用于编码字段id(假如它小于7)。在很多环境下,可以确切地知道在编译时这个标头字节是什么。假如字段具有值范例,那么我们就知道运行时范例永久不能与字段范例差异,而且始终知道字段id。 因此,我们凡是可以生涯计较标头值所需的全部事变,并可以直接将其作为常量嵌入到代码中。这样可以节减分支而且凡是会消除大量的中间说话代码。 选择恰当的数据布局 通过切换到布局数组,很洪流平上消除了索引和维护荟萃的本钱,而且参考跟踪不再呈此刻基准测试中。这有一个弱点,对付大型工具图,这种新要领也许较慢。 选择吻合的算法 Hagar耗费大量时刻对可变长度整数举办编码/解码,这种要领被称为varints,varints是用一个或多个字节序列化整形的一种要领,以减小有用载荷的巨细。很多二进制序列化器行使这种技能,包罗协议缓冲区。乃至.NET的BinaryWriter也行使这种编码。下面是参考资料的一小段:
我想指出ZigZag编码对付包括负值的有标记整数也许更有用,而不是逼迫转换为uint。 这些序列化器中的变量行使称为Little Endian Base-128或LEB128的算法,该算法每字节编码多达7位。它行使每个字节的最高有用位来指示是否跟从另一个字节(1 =是,0 =否)。这是一种简朴的名目,但也许不是最快的。不外PrefixVarint更快,行使PrefixVarint,全部来自LEB128的1都是在有用载荷的开头一次性写入的。这也许让我们行使硬件内涵函数来进步这种编码息争码的速率。通过将巨细信息往前移,我们也可以从有用载荷中一次读取更多字节,从而镌汰内部压力并进步机能。
(编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |