北大青鸟java培训:NET4.6中的性能改进?

如题所述

Mono团队一直以他们对SIMD,即单指令流多数据流特性的支持引以为傲。
SIMD是一种CPU指令集,它能够在同一时间对最多8个值进行同一操作。
而随着.NETCLR版本4.6的推出,安徽IT培训http://www.kmbdqn.cn/发现Windows开发者终于也能够使用这一特性了。
程序集卸载恐怕大多数开发者都不知道这一点:.NET经常会对同一个程序集加载两次。
发生这种情况的条件是.NET首先加载了某个程序集的IL版本,随后又加载了同一程序集的NGEN版本(即预编译版本)。
这种方式对于物理内存来说是相当严重的浪费,尤其是对诸如VisualStudio这样的大型32位应用程序来说更为明显。
而在.NET4.6中,一旦CLR加载了某个程序集的NGEN版本,它会自动清空对应的IL版本所占用的内存。
垃圾回收早先我们曾讨论过.NET4.0中所引入的垃圾回收滞后时间模式,虽然这种方式比起让GC完全停止一段时间的做法要可靠许多,但对于许多GC场景来说,这种方式仍算不上完整。
在.NET4.6中,你将能够通过一种更精密的方式临时中止垃圾回收器的运作,新的TryStartNoGCRegion方法允许你指定在小对象以及大对象的堆中需要多少内存。
如果出现内存不足的情况,运行时将会返回false,或是停止运行,直到通过GC清理得到足够的内存为止。
你可以通过为TryStartNoGCRegion传入某个标记的方式控制这一行为,如果你成功地进入了某个无GC区域(在过程结束前不允许进行GC),那么在过程结束时必须调用EndNoGCRegion方法。
在官方文档中并没有说明该方法是否是线程安全的,不过考虑到GC的工作原理,你应当尽量避免让两个进程同时尝试改变GC状态的做法。
对于GC的另一项改进是它处理pinned对象(即一旦分配后不可移动位置的对象)的方式。
虽然在文档中对此方面的描述有些语焉不详,但当你固定了某个对象的位置时,通常也会固定其相邻对象的位置。
RichLander在文中写道:GC将以一种更优化的方式处理pinned对象,因此GC能够将pinned对象周围的内存进行更有效地压缩。
对于大量使用pin方式的大规模应用来说,这一改动将极大地改进应用的性能。

温馨提示:答案为网友推荐,仅供参考
相似回答
大家正在搜