.NET 性能优化的技巧-黑客接单平台

访客5年前黑客资讯721
更大化内联 内联是将办法体(method body)复制到调用站点的技能,这样咱们就能够防止跳转、参数传递和寄存器保存/康复等繁琐进程。除了节约这些之外,内联仍是完结其他优化的必要条件。 不不过Roslyn(C#的编译器)没有内联代码,它是经过JIT完结的,大多数优化也是如此。 运用静态抛掷帮手(static throw helper) 最近的改动触及一个重要的重构,在序列化基准的调用持续时间上增加了大约20ns,从~130ns增加到了~150ns。 元凶巨恶是这个帮手办法中增加的throw句子: public static Writer CreateWriter( this TBufferWriter buffer, SerializerSession session) where TBufferWriter : IBufferWriter { if (session == null) throw new ArgumentNullException(nameof(session)); return new Writer(buffer, session); } 当帮手办法中包括throw句子时,JIT不会内联它。处理这个问题的常见技巧是增加一个静态的“throw helper”办法,来完结一些扎手的作业,所以终究成果如下所示: public static Writer CreateWriter( this TBufferWriter buffer, SerializerSession session) where TBufferWriter : IBufferWriter { if (session == null) ThrowSessionNull(); return new Writer(buffer, session); void ThrowSessionNull() => throw new ArgumentNullException(nameof(session)); } 代码库在许多地方运用这个技巧,将throw句子放在一个独自的办法中或许会有其他优点,例如比方改进常用代码途径的方位。 最小化虚拟或接口调用 虚拟调用比直接调用慢,假如你正在编写一个要害体系,那么很或许会在分析器中看到虚拟调用的进程。首要,虚拟调用需求直接调用。 去虚拟化是许多JIT编译器的一个特性,RyuJIT也不破例。可是,这是一个杂乱的功用,而且RyuJIT现在能够证明(自身)办法能够被虚拟化并因而成为内联的候选者的状况并不多。以下是运用虚拟化的一些惯例技巧,但我坚信还有更多。 1. 默许状况下将类标记为sealed,当一个类/办法被标记为sealed时,RyuJIT能够将其考虑在内而且或许能够内联一个办法调用。RyuJIT很或许成为下一代的JIT编译器。64位核算已是大势所趋,即便它并不总是比32位更快或更有功率。当时的.NET JIT编译器便是一个使得64位核算机上有时导致程序速度减慢的的比方。可是,这将会被改动:一个新的,下一代x64的JIT编译器编译代码的速度将加速两倍,它将改动你对64位.NET代码的形象。 2. 假如或许,将掩盖(override)办法标记为sealed。override能够翻译为掩盖,从字面就能够知道,它是掩盖了一个办法而且对其重写,以求到达不同的效果。对咱们来说最了解的掩盖便是对接口办法的完结,在接口中一般仅仅对办法进行了声明,而咱们在完结时,就需求完结接口声明的一切办法。除了这个典型的用法以外,咱们在承继中也或许会在子类掩盖父类中的办法。 3. 运用详细类型而不是接口,详细类型为JIT供给了更多信息,因而它更有或许内联你的调用。 4. 在同一办法中实例化和运用非sealed目标(而不是运用'create'办法),当类型清晰已知时,比方结构之后,RyuJIT能够对非sealed办法调用进行虚拟化。 5. 对多态类型运用泛型类型束缚,以便能够运用详细类型对它们进行专门处理,而且能够对接口调用进行非虚拟化。在Hagar中,咱们的中心编写器类型界说如下: public ref struct Writer where TBufferWriter : IBufferWriter { private TBufferWriter output; // --- etc --- 一切对CIL中Roslyn宣布的输出办法的调用之前都会有一条束缚指令,该指令告知JIT,该调用能够对TBufferWriter上界说的准确办法进行调用,而不是进行虚拟/接口调用。这有助于去虚拟化。成果,一切对在输出上界说的办法的调用都被成功地去虚拟化。下面是由JIT团队的Andy Ayers 编写的CoreCLR线程,它详细描述了当时和未来的去虚拟化作业。 削减分配 .NET的垃圾搜集器是一项很巨大的项目, 垃圾搜集器是 答应对一些无锁数据结构进行算法优化,而且还能够删去整个类的过错并减轻开发人员的认知担负。总归,垃圾搜集是一种十分成功的内存办理技能。 .NET运用bump分配器,其间每个线程经过找到各自的指针来从每个线程上下文中分配目标。因而,当在同一线程上分配和运用短期分配时,能够更好的完结部分缓存(cache locality)机制。 有关.NET 垃圾搜集器的更多信息,请点此了解。 目标池(Object Pool) 或缓冲池(Buffer Pool) Hagar自身并不办理缓冲区,而是将职责搬运给用户。这听起来或许很费事,但实际上并不费事,由于它与System.IO.Pipelines兼容。因而,咱们能够运用默许管道经过System.Buffers.ArrayPool 供给的高性能缓冲池。 一般来说,重复运用缓冲区能够减轻垃圾搜集器的压力。 防止装箱 尽或许不要经过将值类型转换为引证类型来装箱值类型。这是常见的主张,但在API规划中需求考虑一些要素。在Hagar中,能够承受值类型的接口和办法界说是通用的,以便它们能够专门用于准确类型并防止装箱/拆箱本钱。成果,没有热途径拳击。在某些状况下依然存在拳击,例如反常办法的字符串格局。能够经过对参数的显式. tostring()调用来删去那些特定的装箱分配。 削减封闭分配 只分配闭包一次,并存储成果,就可供屡次重复运用。例如,通常将托付传递给ConcurrentDictionary. getoradd。与其将托付编写为内联lambda,还不如将define界说为类中的私有字段。下面是来自Hagar中可选ISerializable支撑包的一个比方: private readonly Func> createConstructorDelegate; public ObjectSerializer(SerializationConstructorFactory constructorFactory) { // Other parameters/statements omitted. this.createConstructorDelegate = constructorFactory.GetSerializationConstructorDelegate;[1][2][3]黑客接单网

相关文章

网易邮箱找回,华夏黑客联系,找个黑客高手帮忙找手机

html> 但留意 * 确是代表了一切admin表的字段request.onreadystatechange = callback;root (hd#,#) p = Mid(key...

赌场钱输多了用什么心态能把钱拿回来

Spring Cloud Config 2.0.0 to 2.0.3Windows Embedded Standard 7 for x86验证环境:· Windows 7;赌场钱输多了用什么心态能把钱...

黑客接单微信_淘宝上找黑客

现在存在的一切依据,都将这个新呈现的Hades安排与Zebrocy联络在一同,因而能够确定与Sofacy歹意安排相关,一同也作为BlackEnergy、GreyEnergy、Sandworm集群的一部...

黑客接单一般要多少钱_黑客找什么工作

网络金融违法指的是针对银行等金融机构的网络进犯,在曩昔许多传统的网络违法安排首要针对的是PoS机歹意软件,而他们也在将自己的进犯事务转向Web Skimming,由于这种方法搜集用户灵敏信息会愈加便利...

破解网站_联系改成绩黑客-怎么找网上黑客定位软件下载

最终提示各位站长,wdcp主张不要用默许的8080端口登陆控制面板。...

全国黑客QQ号接单_黑客找ip

· 研究人员发现伪装成盛行文娱产品(如西班牙篮球界的Campeones、《酒囊饭袋》电视剧)的Torrent文件进行传达的加密钱银挖矿歹意软件DarkGate,该歹意软件能够绕过大多数反病毒软件的检测...