加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

.NET 性能优化的技巧

发布时间:2019-08-22 09:52:46 所属栏目:建站 来源:gejigeji
导读:最大化内联 内联是将要领体(method body)复制到挪用站点的技能,这样我们就可以停止跳转、参数转达和寄存器生涯/规复等繁琐进程。除了节减这些之外,内联照旧实现其他优化的须要前提。 不不外Roslyn(C#的编译器)没有内联代码,它是通过JIT实现的,大大都优

当伟大工具包括众所周知的字段(如int,Guid,string)时,代码天生器将直接插入对这些范例的手动编码编解码器的挪用,而不是挪用CodecProvider来检索该范例的IFieldCodec 实例。这应承JIT内联那些挪用,并停止了假造/接口间接。

在运行时专门化泛型范例

与上面相同,代码天生器可以天生在运行时行使专门化的代码。

预先计较常数值以消除某些分支

在序列化时代,每个字段都带有一个标头,凡是是一个字节。它会汇报解串器哪个字段是编码的。此字段问题包括3条信息:字段的规格(牢靠宽度、长度前缀、标志脱离、引用等),字段的模式范例(预期、众所周知、早年界说的、编码)用于多态,并将最后3位专用于编码字段id(假如它小于7)。在很多环境下,可以确切地知道在编译时这个标头字节是什么。假如字段具有值范例,那么我们就知道运行时范例永久不能与字段范例差异,而且始终知道字段id。

因此,我们凡是可以生涯计较标头值所需的全部事变,并可以直接将其作为常量嵌入到代码中。这样可以节减分支而且凡是会消除大量的中间说话代码。

选择恰当的数据布局

通过切换到布局数组,很洪流平上消除了索引和维护荟萃的本钱,而且参考跟踪不再呈此刻基准测试中。这有一个弱点,对付大型工具图,这种新要领也许较慢。

选择吻合的算法

Hagar耗费大量时刻对可变长度整数举办编码/解码,这种要领被称为varints,varints是用一个或多个字节序列化整形的一种要领,以减小有用载荷的巨细。很多二进制序列化器行使这种技能,包罗协议缓冲区。乃至.NET的BinaryWriter也行使这种编码。下面是参考资料的一小段:

  1. protected void Write7BitEncodedInt(int value) { 
  2.     // Write out an int 7 bits at a time.  The high bit of the byte, 
  3.     // when on, tells reader to continue reading more bytes. 
  4.     uint v = (uint) value;   // support negative numbers 
  5.     while (v >= 0x80) { 
  6.         Write((byte) (v | 0x80)); 
  7.         v >>= 7; 
  8.     } 
  9.     Write((byte)v); 

我想指出ZigZag编码对付包括负值的有标记整数也许更有用,而不是逼迫转换为uint。

这些序列化器中的变量行使称为Little Endian Base-128或LEB128的算法,该算法每字节编码多达7位。它行使每个字节的最高有用位来指示是否跟从另一个字节(1 =是,0 =否)。这是一种简朴的名目,但也许不是最快的。不外PrefixVarint更快,行使PrefixVarint,全部来自LEB128的1都是在有用载荷的开头一次性写入的。这也许让我们行使硬件内涵函数来进步这种编码息争码的速率。通过将巨细信息往前移,我们也可以从有用载荷中一次读取更多字节,从而镌汰内部压力并进步机能。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读