.NET 性能优化的技巧
副问题[/!--empirenews.page--]
最大化内联 内联是将要领体(method body)复制到挪用站点的技能,这样我们就可以停止跳转、参数转达和寄存器生涯/规复等繁琐进程。除了节减这些之外,内联照旧实现其他优化的须要前提。 不不外Roslyn(C#的编译器)没有内联代码,它是通过JIT实现的,大大都优化也是云云。 行使静态抛掷助手(static throw helper) 最近的变革涉及一个重要的重构,在序列化基准的挪用一连时刻上增进了约莫20ns,从~130ns增进到了~150ns。 祸首罪魁是这个助手要领中添加的throw语句:
当助手要领中包括throw语句时,JIT不会内联它。办理这个题目的常见能力是添加一个静态的“throw helper”要领,来完成一些棘手的事变,以是最终功效如下所示:
代码库在很多处所行使这个能力,将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中,我们的焦点编写器范例界说如下:
全部对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 一样平常来说,一再行使缓冲区可以减轻垃圾网络器的压力。 停止装箱 (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |