.NET 性能优化的技巧
|
尽可能不要通过将值类型转换为引用类型来装箱值类型。这是常见的建议,但在API设计中需要考虑一些因素。在Hagar中,可以接受值类型的接口和方法定义是通用的,以便它们可以专门用于精确类型并避免装箱/拆箱成本。结果,没有热路径拳击。在某些情况下仍然存在拳击,例如异常方法的字符串格式。可以通过对参数的显式. tostring()调用来删除那些特定的装箱分配。 减少关闭分配 只分配闭包一次,并存储结果,就可供多次重复使用。例如,通常将委托传递给ConcurrentDictionary. getoradd。与其将委托编写为内联lambda,还不如将define定义为类中的私有字段。下面是来自Hagar中可选ISerializable支持包的一个例子:
尽量减少复制 .NET Core 2.0和2.1以及最近的C#版本,在删除数据复制过程的方面取得了相当大的进步。最值得注意的是Span 使用Span 一个Span 对于.NET Core来说,Span Hagar广泛使用Span 通过ref传递结构以最小化堆栈上的副本 Hagar使用两个主要结构,Reader 和Writer 在没有干预的情况下,使用这些结构进行的每个方法调用都会带来很大的影响,因为每个调用都需要将整个结构复制到堆栈中。 我们可以通过将这些结构作为ref参数传递来避免副本的产生,另外,C#还支持使用ref this作为扩展方法的目标,这非常方便。据我所知,没有办法确保特定的结构类型总是由ref传递,如果你不小心在调用的参数列表中省略了ref,这可能会导致运行错误。 避免保护性拷贝(defensive copy) Roslyn有时需要做一些工作来保证一些语言不变量,当结构存储在只读字段中时,编译器将插入一些指令,以避免复制该字段,然后再将其包含到任何能保证不会对其进行修改的操作中。通常,这意味着调用在结构类型本身上定义的方法,因为将结构作为参数传递给在另一类型上定义的方法已经需要将结构复制到堆栈上(除非通过ref或in传递)。 如果将 有时,如果你无法将其定义为只读结构,则最好在其他不可变结构字段上省略readonly修饰符。 以Jon Skeet的NodaTime库为例,在这个示例中,Jon使大多数结构变为只读,因此能够将readonly修饰符添加到包含这些结构的字段中,而不会对性能产生负面影响。 减少分支和分支错误预测 (编辑:PHP编程网 - 湛江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |


