.NET 4.6中的性能改进

 .NET 4.6中带来了一些与性能改进相关的CLR特性,这些特性中有一部分将会自动生效,而另外一些特性,例如SIMD与异步本地存储(Async Local Storage)则需要对编写应用的方式进行某些改动。

  SIMD

  Mono团队一直以他们对SIMD,即单指令流多数据流特性的支持引以为傲。SIMD是一种CPU指令集,它能够在同一时间对最多8个值进行同一操作。而随着.NET CLR版本4.6的推出,Windows开发者终于也能够使用这一特性了。

  为了实际观察一下SIMD的效果,可以参考一下这个示例。假设你需要通过c[i] = a[i] + b[i]这种形式对两个数组进行相加,以得到第三个数组。通过使用SIMD,你可以按照以下方式编写代码:

for (int i = 0; i < size; i += Vector.Count)
 {
     Vector v = new Vector(A,i) + new Vector(B,i);
     v.CopyTo(C,i);
 }

  请注意这个循环是如何按Vector<int>.Count的取值进行递增的,根据CPU类型的不同,它的取值可能是4或是8。.NET JIT编译器将根据CPU的不同生成相应的代码,以4或8的值对数组进行批量相加。

  这种方式看起来有些繁琐,因此微软还提供了一系列辅助类,包括:

  程序集卸载

  恐怕大多数开发者都不知道这一点:.NET经常会对同一个程序集加载两次。发生这种情况的条件是.NET首先加载了某个程序集的IL版本,随后又加载了同一程序集的NGEN版本(即预编译版本)。这种方式对于物理内存来说是相当严重的浪费,尤其是对诸如Visual Studio这样的大型32位应用程序来说更为明显。

  而在.NET 4.6中,一旦CLR加载了某个程序集的NGEN版本,它会自动清空对应的IL版本所占用的内存。

  垃圾回收

  早先我们曾讨论过.NET 4.0中所引入的垃圾回收滞后时间模式,虽然这种方式比起让GC完全停止一段时间的做法要可靠许多,但对于许多GC场景来说,这种方式仍算不上完整。

  在.NET 4.6中,你将能够通过一种更精密的方式临时中止垃圾回收器的运作,新的TryStartNoGCRegion方法允许你指定在小对象以及大对象的堆中需要多少内存。

  如果出现内存不足的情况,运行时将会返回false,或是停止运行,直到通过GC清理得到足够的内存为止。你可以通过为TryStartNoGCRegion传入某个标记的方式控制这一行为,如果你成功地进入了某个无GC区域(在过程结束前不允许进行GC),那么在过程结束时必须调用EndNoGCRegion方法。

  在官方文档中并没有说明该方法是否是线程安全的,不过考虑到GC的工作原理,你应当尽量避免让两个进程同时尝试改变GC状态的做法。

  对于GC的另一项改进是它处理pinned对象(即一旦分配后不可移动位置的对象)的方式。虽然在文档中对此方面的描述有些语焉不详,但当你固定了某个对象的位置时,通常也会固定其相邻对象的位置。Rich Lander在文中写道:

GC将以一种更优化的方式处理pinned对象,因此GC能够将pinned对象周围的内存进行更有效地压缩。对于大量使用pin方式的大规模应用来说,这一改动将极大地改进应用的性能。

  GC对于如何使用较早的几代中的内存方面也体现出更好的智能性,Rich继续写道:

第1代对象升级为第2代对象的方式也得到了改进,以更有效地使用内存。在为某一代分配新的内存空间之前,GC会先尝试使用可用的空间。同时,在利用可用空间区域创建对象时使用了新的算法,使新分配的空间大小比起从前更接近于对象的大小。

  异步本地存储

  最后一项改进与性能并没有直接的关系,但通过有效的利用仍然能达到优化的效果。在异步API还没有流行起来的年代,开发者可以利用线程本地存储(TLS)缓存信息。TLS对于某个特定的线程来说就像是一种全局对象,这意味着你可以直接访问上下文信息并进行缓存,而无需显式地传递某种上下文对象。

  而在async/await模式中,线程本地存储就变得毫无用武之地了。因为每次调用await的时候,都有可能跳转至另一个线程。而且即便侥幸避开了这种情况,但其它代码也有可能跳转到你的线程中并干扰TLS中的信息。

  新版本的.NET引入了异步本地存储(ALS)机制以解决这一问题,ALS在语义上等价于线程本地存储,但它能够随着await的调用进行相应的跳转。这一功能将通过AsyncLocal泛型类实现,其内部将调用CallContext对象用于保存数据。

时间: 2024-08-01 14:17:53

.NET 4.6中的性能改进的相关文章

android app 开发过程中 对于性能优化的总结

一款手机应用  从开发过程中就要做好 性能优化,这样才能 让用户体验度 提升, 假如 我们打开一个应用 出现卡顿, 不流畅,则会很影响 用户对该应用的态度,产品狗 都很注意这些人机交互方面的 体验. 谷歌官方也是一直在优化 android 系统,不论是  碎片化处理 还是 系能 上面,这方面 ios 就做的比较好,配置比 android 低,但是流畅度却比android高,体验效果更好. 官方推荐方案:http://www.oschina.net/news/60157/android-perfo

java编程中的性能提升问题

java编程中的性能提升 软件产品犹如一栋大楼,大楼在建设初期,会有楼房规划,建筑构想,打牢地基,后面才是施工人员进行进行实质性的建设.要保证软件产品的高质量,优秀的架构,优秀的产品设计,是产生高质量的前提.同时,没有过硬的编码实现,一样得不到预期的效果.纵观现在的产品,产品架构没多大差别,基本运用基线版本进行局点定制.而系统中的一些功能性能常常不过关,问题往往就出在编码实现上.这块是开发人员在开发过程中需要注意的.在JAVA程序中,性能问题的大部分原因并不在于JAVA语言,而是程序本身.养成良

在j2ee开发中影响性能的原因以及相关处理性的建议

java是现在比较流行的软件开发语言,同时也是互联网应用中安全性相对较高的一种开发语言了.被很多的电子金融系统开发企业以及电子商务网站建设企业所看重.虽然说在如今的互联网开发中,它比较有优势,然而用得不当的话,反而会使电子商务网站建设的性能受到影响.电子商务网站建设企业,就从多年的java商城开发中说说影响java商城系统和jsp商城效率的原因.    1.缺乏正确的容量规划    容量规划是一个全面的和发展的过程标准,预测当前和未来的IT环境容量需求.制定合理的容量规划不仅会确保和跟踪当前IT

Docker Swarm和Kubernetes在大规模集群中的性能比较

Contents 这篇文章主要针对Docker Swarm和Kubernetes在大规模部署的条件下的3个问题展开讨论.在大规模部署下,它们的性能如何?它们是否可以被批量操作?需要采取何种措施来支持他们的大规模部署和运维? 我们需要使用侧重于用例的基准测试来对所有容器平台进行比较,这样采用者才可以做出正确的决策. 笔者从用户的角度建立了一套测评工具,用普通的方法测试Docker Swarm和Kubernetes.我只评估了通用的功能:容器的启动时间和容器罗列时间. Swarm的性能比Kubern

优化Web中的性能

优化Web中的性能 简介 web的优化就是一场阻止http请求最终访问到数据库的战争. 优化的方式就是加缓存,在各个节点加缓存. web请求的流程及节点 熟悉流程及节点,才能定位性能的问题.而且优化的顺序一般也是按请求的流程逐一优化.这里的流程只是做个概要,并不代表全面. 整个流程是以最快的方式让用户看到结果 定位的方法 思路是:把看不见的http,具体化.可视化. 定位是优化的前提.没有准确的定位就无法有效的解决问题. 浏览器 看整个请求的时间 看整个页面加载的时间 看页面加载的数据大小 看页

java编程中&#39;为了性能&#39;一些尽量做到的地方

java编程中'为了性能'一些尽量做到的地方 2011-08-16 14:34:59|  分类: JAVA |  标签:java编程  缓存经常使用的对象  |举报|字号 最近的机器内存又爆满了,出了新增机器内存外,还应该好好review一下我们的代码,有很多代码编写过于随意化,这些不好的习惯或对程序语言的不了解是应该好好打压打压了. 下面是参考网络资源和总结一些在java编程中尽可能做到的一些地方- 1.尽量在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并

Java编程中提高性能的几点建议

尽量减少对变量的重复计算 如 for(int i=0;i<list.size();i++) 应该改为 for(int i=0,len=list.size();i<len;i++) 并且在循环中应该避免使用复杂的表达式,在循环中,循环条件会被反复计算,如果不使用复杂表达式,而使循环条件值不变的话,程序将会运行的更快. 尽量使用移位来代替'a/b'的操作 "/"是一个代价很高的操作,使用移位的操作将会更快和更有效 如 int num = a / 4; int num = a /

x86服务器中网络性能分析与调优 转

x86服务器中网络性能分析与调优 2017-04-05 巨枫 英特尔精英汇 [OpenStack 易经]是 EasyStack 官微在2017年新推出的技术品牌,将原创技术干货分享给您,本期我们讨论 [x86服务器中网络性能分析与调优] 那些事! >> 网络性能理论极限 网络数据包处理的性能指标,一般包括吞吐.延时.丢包率.抖动等. 数据包有大有小,数据包的大小对这些性能指标有很大的影响. 一般认为服务器处理能力很强,不是数据包处理的瓶颈,而通过物理线路能够传送数据包的最大速率,即线速(Wir

使用ThinkPHP开发中MySQL性能优化的最佳21条经验

使用ThinkPHP开发中MySQL性能优化的最佳21条经验讲解,目前,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情.当我们去设计数据库表结构,对操作数据库时(尤其是查表时的SQL语句),我们都需要注意数据操作的性能.这里,我们不会讲过 多的SQL语句的优化,而只是针对MySQL这一Web应用最多的数据库.希望下面的这些优化技巧对你有用. 1. 为查询缓存优化你的查询大多数的MySQ