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

访客6年前黑客资讯770
更大化内联 内联是将办法体(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]黑客接单网

相关文章

黑客qq群,找电脑高手黑客,找先办事后付款的黑客

一、关于007安排的工业链 1衔接数据库:mysql、mssql、oracle、sqlite、postgresql、ODBC、PDO对应建议推广的软件 +[no]cl (Control disp...

找本书开头是男主角是黑客,女友被富二代骗走,关

https://support.microsoft.com/zh-cn/help/4500705/customer-guidance-for-cve-2019-0708官方补丁再来看看struct _...

专业黑客接单联系方式_找黑客盗号要多少钱

勒索软件需求指出的是,以上趋势仅依据监控数据,实践许多用户是黑客经过服务器进犯浸透侵略内网后投进的勒索病毒,亦或用户终端不联网经过内网其他机器感染的勒索病毒,这些景象下是无法监控到数据的。 (二) 运...

邓紫棋身高_去哪里找黑客帮忙-找黑客盗微信多少钱6

「邓紫棋身高_去哪里找黑客帮忙-找黑客盗微信多少钱6」$sudo arp -aprivate Burp Collaborator server会话操控(需求MSF RPC 衔接)import java...

什么是黑客-黑客精神(1)

黑客是什么?没有多少自称黑客的人能解答。     在这些浮于世的黑客眼中,黑客就是那一个个被D死的服务器、被挂上姓名的主页、被篡改了版权的程序、被植入木马的软件……在这些人没有注意...

通过Rust编写操作系统之内存的分页与管理介绍(上)-黑客接单平台

Rust是一门体系编程言语,专心于安全,尤其是并发安全,支撑函数式和指令式以及泛型等编程范式的多范式言语。Rust在语法上和C++相似,可是规划者想要在保证功用的一起供给更好的内存安全。 Rust开始...