老尸 发表于 2015-1-18 11:19:59

ASP.NET网页编程之.NET 4.5中义务并行类库的改善仓酷云

在VC.net的版本上,为了让C++运行在.NETFramework中,微软为C++引进了托管,就是托管C++(ManagedC++),这个根本就没有流行起来,自托管C++产生以后就没有收到过好评。微软正在勉力改善.NET4.5中使用程序的功能,出格是利用义务并行类库(TaskParallelLibrary)的那些使用。接上去我会带你预览将要完成的改善内容:
Task,Task<TResult>
.NET并行编程API的中心是Task对象。关于如许主要的类,微软设法想法包管它要尽量小。Task的年夜多半属性都没有保留在类自己当中,而是保留在另外一个名为ContingentProperties的对象中。这个二级对象会在程序必要的时分才创立,如许就会下降年夜多半一样平常情形下的内存占用。
.NET4.0公布的时分,最多见的情况是分支兼并(fork-join)款式的编程,就像我们在Parallel.ForEach和ParallelLINQ中看到的那样。但是,有了.NET4.5和个中引进的异步机制,按次款式的编程就取而代之,占有主导位置。微软十分确信这会是次要的体例,因而他们把ContinuationObject挪动到Task中,把其他字段挪动到ContingentProperties中。这使得按次布局的代码运转更快,而Task对象的范围更小。
Task<TResult>也制止了一些不必要的守候。它最后具有四个属性,可是JosephE.Hoag注释说:
因为我们举行了一些很伶俐的布局调剂,了局只要m_result字段才是真正需要的。经由过程对已存在于基础的Task类中的字段从头使用,我们能够放弃m_valueSelector和m_futureState字段,而存储在m_resultWasSet中的信息能够存储在基础范例的上述形态标识中。
了局创立Task<Int32>所需的工夫会削减49-55%,对象的巨细会削减52%。
Task.WaitAll,Task.WaitAny
试想一下,我们必要同时守候十亿个义务。在一台x64的盘算机上,这会招致12,000,000比特的负载,这还没有盘算义务自己。假如利用.NET4.5,负载会降到仅仅64比特。同时WaitAny的负载也会从23,200,000比特降到152比特。
之以是呈现云云戏剧化的效果,是由于微软改动了利用中心同步基元(kernelsynchronizationprimitives)的体例。在之前的版本中,每一个义务都必要一个基元(primitive)。如今已年夜年夜削减,每一个守候操纵只必要一个基元,与操纵中的义务数目有关。
ConcurrentDictionary
在.NET中,只要援用范例和很小的值范例才干够以原子的体例赋值。较年夜的值范例——像Guid——则没法以原子的体例读写。在.NET4.0中,为懂得决这个成绩,ConcurrentDictionary会利用node对象,每次与键值联系关系的值产生改动的时分,城市从头创立这个对象。在.NET4.5中,只要在没法以原子的体例对值举行写操纵的时分,才会创立新的node对象。
另外一项改动是我们能够静态地创立锁。IgorOstrovsky写到:
在理论中,为了到达最年夜吞吐量,常常必要大批锁。另外一方面,我们又不但愿分派太多锁对象,出格是在ConcurrentDictionary最初只存储了很少项目标时分。
想要提拔功能,就要削减内存分派
Joseph写到:
在我们的评测了局中你能够看到,在测试平分配的内存数目和完成测试所需的工夫之间有间接干系。当我们独自检察的时分,内存分派并非十分高贵。可是,当内存体系只是偶然清算不利用的内存时,成绩就呈现了,而且成绩呈现的频次和要分派的内存数目成反比。因而,你分派越多的内存,对内存举行渣滓接纳的频次就越频仍,你的代码功能就会变得越差。
想要下降内存利用,一种体例就是制止利用闭包(closure)。不要在匿名的函数中捕捉部分变量,我们能够把它传送给Task的机关函数,作为它的“形态(state)对象”。从.NET4.5入手下手,Task.ContinueWith也会撑持形态对象。
另外一种削减内存利用的手艺是缓存常常利用的义务。比方,假定一个函数会承受一个数组作为参数,并前往Task<int>。由于关于空数组了局总会是一样的,以是缓存代表空数组的Task就很公道。
下一个技能是制止让义务不用要地“收缩”。当某些代码触发了创立ContingentProperties的操纵,Task对象就会收缩。最常常呈现的缘故原由包含:


[*]创立的义务带有CancellationToken
[*]义务是从非默许的ExecutionContext创立的
[*]Task作为父Task介入到“布局化并行机制(structuredparallelism)”中
[*]Task以Faulted形态停止
[*]Task经由过程((IAsyncResult)Task).AsyncWaitHandle.Wait()处于守候形态
人人还要记着,义务收缩其实不必定是好事。它只是必要注重的成绩,如许我们就不会做不必要的事变,像传进历来不会用到的CancellationToken等。
检察英文原文:TaskParallelLibraryImprovementsin.NET4.5
译者侯伯薇是InfoQ中文站架构社区编纂,有多年对日和国际项目开辟履历,今朝存眷企业中手艺与实践营业之间的交融和合作。
也不知道,我同学昨天说数据挖掘很好。

因胸联盟 发表于 2015-1-20 20:41:45

有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。

小魔女 发表于 2015-1-24 14:11:09

这也就是最近几年来随着各种新的后台技术的诞生,CGI应用在Internet上越来越少的原因。CGI方式不适合大访问量的应用。

分手快乐 发表于 2015-1-25 08:47:23

Asp.net:首先来说,Asp.net和Asp没什么关系,看着像是升级版本什么的,其实没什么联系。Asp是脚本编程,用的是ASP语言,而ASP.net用的是C#语言,完全不同的东西。

仓酷云 发表于 2015-1-25 09:11:03

asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源

透明 发表于 2015-1-25 22:57:01

同时也感谢博客园给我们这个平台,也感谢博客园的编辑们做成专题引来这么多高人指点。

海妖 发表于 2015-1-27 10:23:08

最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。

冷月葬花魂 发表于 2015-2-6 16:31:31

由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。

只想知道 发表于 2015-2-8 04:50:47

由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。

若天明 发表于 2015-2-10 18:10:38

现在主流的网站开发语言无外乎asp、php、asp.net、jsp等。

莫相离 发表于 2015-2-28 23:01:06

主流网站开发语言之JSP:JSP和Servlet要放在一起讲,是因为它们都是Sun公司的J2EE(Java2platformEnterpriseEdition)应用体系中的一部分。

再见西城 发表于 2015-3-1 04:59:12

asp.net空间的支持有:ASP.NET1.1/虚拟目录/MicrosoftFrontPage2000扩展/CDONTS,同时他的网站上也提供了Asp.net的使用详解和程序源代码,相信对使用ASP.NET编程的程序员来说会非常有用哦!

活着的死人 发表于 2015-3-2 22:16:04

JSP/Servlet虽然在国内目前的应用并不广泛,但是其前途不可限量。

小女巫 发表于 2015-3-9 04:49:55

以上是语言本身的弱点,在功能方面ASP同样存在问题,第一是功能太弱,一些底层操作只能通过组件来完成,在这点上是远远比不上PHP/JSP,其次就是缺乏完善的纠错/调试功能,这点上ASP/PHP/JSP差不多。

简单生活 发表于 2015-3-11 18:30:11

Asp.net脚本的出现,为ASP空间带来了更高的稳定性,同时也为程序员建站提供更高环境!

精灵巫婆 发表于 2015-3-19 07:21:59

它可通过内置的组件实现更强大的功能,如使用A-DO可以轻松地访问数据库。

蒙在股里 发表于 2015-3-27 12:08:43

ASP.Net摆脱了以前ASP使用脚本语言来编程的缺点,理论上可以使用任何编程语言包括C++,VB,JS等等,当然,最合适的编程语言还是MS为.NetFrmaework专门推出的C(读csharp)。
页: [1]
查看完整版本: ASP.NET网页编程之.NET 4.5中义务并行类库的改善仓酷云