领导力大挑战
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
该内容已经被标记书签!
标记书签错误,请重试!
作者 Jonathan Allen 译者 侯伯薇 发布于 2011年12月8日
微软正在努力改进.NET 4.5中应用程序的性能,特别是使用任务并行类库(Task Parallel Library)的那些应用。接下来我会带你预览将要完成的改进内容:
Task, Task<TResult>
.NET并行编程API的核心是Task对象。对于这样重要的类,微软想法设法保证它要尽可能小。Task的大多数属性都没有保存在类本身之中,而是保存在另一个名为ContingentProperties的对象中。这个二级对象会在程序需要的时候才创建,这样就会降低大多数一般情况下的内存占用。
.NET 4.0发布的时候,最常见的情形是分支合并(fork-join)样式的编程,就像我们在Parallel.ForEach和Parallel LINQ中看到的那样。然而,有了.NET 4.5和其中引入的异步机制,顺序样式的编程就取而代之,占据主导地位。微软非常确信这会是主要的方式,因此他们把ContinuationObject移动到Task中,把其他字段移动到ContingentProperties中。这使得顺序结构的代码运行更快,而Task对象的规模更小。
Task<TResult>
由于我们进行了一些很聪明的结构调整,结果只有m_result字段才是真正必要的。通过对已经存在于基本的Task类中的字段重新利用,我们可以废弃m_valueSelector和m_futureState字段,而存储在m_resultWasSet中的信息可以存储在基本类型的上述状态标识中。
结果创建Task<Int32>
Task.WaitAll, Task.WaitAny
试想一下,我们需要同时等待十亿个任务。在一台x64的计算机上,这会导致12,000,000比特的负载,这还没有计算任务本身。如果使用.NET 4.5,负载会降到仅仅64比特。同时WaitAny的负载也会从23,200,000比特降到152比特。
之所以出现如此戏剧化的效果,是因为微软改变了使用核心同步基元(kernel synchronization primitives)的方式。在之前的版本中,每个任务都需要一个基元(primitive )。现在已经大大减少,每个等待操作只需要一个基元,与操作中的任务数量无关。
ConcurrentDictionary
在.NET中,只有引用类型和很小的值类型才能够以原子的方式赋值。较大的值类型——像Guid——则无法以原子的方式读写。在.NET 4.0中,为了解决这个问题,ConcurrentDictionary会使用node对象,每次与键值关联的值发生改变的时候,都会重新创建这个对象。在.NET 4.5中,只有在无法以原子的方式对值进行写操作的时候,才会创建新的node对象。
另一项改变是我们可以动态地创建锁。Igor Ostrovsky写到:
在实践中,为了达到最大吞吐量,往往需要大量锁。另一方面,我们又不希望分配太多锁对象,特别是在ConcurrentDictionary最后只存储了很少项目的时候。
想要提升性能,就要减少内存分配
Joseph写到:
在我们的评测结果中你可以看到,在测试中分配的内存数量和完成测试所需的时间之间有直接关系。当我们单独查看的时候,内存分配并不是非常昂贵。但是,当内存系统只是偶尔清理不使用的内存时,问题就出现了,并且问题出现的频率和要分配的内存数量成正比。因此,你分配越多的内存,对内存进行垃圾回收的频率就越频繁,你的代码性能就会变得越差。
想要降低内存使用,一种方式就是避免使用闭包(closure)。不要在匿名的函数中捕获局部变量,我们可以把它传递给Task的构造函数,作为它的“状态(state)对象”。从.NET 4.5开始,Task.ContinueWith也会支持状态对象。
另一种减少内存使用的技术是缓存经常使用的任务。例如,假设一个函数会接受一个数组作为参数,并返回Task<int>
下一个技巧是避免让任务不必要地“膨胀”。当某些代码触发了创建ContingentProperties的操作,Task对象就会膨胀。最经常出现的原因包括:
大家还要记住,任务膨胀并不一定是坏事。它只是需要注意的问题,这样我们就不会做不需要的事情,像传入从来不会用到的CancellationToken等。
查看英文原文:Task Parallel Library Improvements in .NET 4.5
译者 侯伯薇 是InfoQ中文站架构社区编辑,有多年对日和国内项目开发经验,目前关注企业中技术与实际业务之间的融合和协作。
在实施Scrum项目的过程中,Scrum Master的角色是相当关键的,因为他是团队的推动者。本文围绕什么是仆人式领导、仆人式领导的起源、如何将领导力传达给团队、Scrum Master作为仆人式领导者的角色展开叙述,同时重点阐述仆人式领导者应有的基本内外特征。
论道WP第三篇专栏,以应用程序栏的使用为中心,包括了软键盘带来的问题、应用程序栏介绍、如何绑定应用程序栏的属性等几个方面的具体话题,为开发者顺利使用应用程序栏开发提供了具体指导。
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中对于锁的性能优化,以及锁的存储结构及升级过程。
本次分享将首先介绍现代富文本编辑器的组成和实现,然后结合UEditor的开发过程,与参会者分享UEditor在设计和实现的过程中,所涉及到的核心功能的细节实现。
本次演讲视频录制于百度技术沙龙。
我们所开发的应用程序大多都需要提供一个图形用户界面(GUI)。关于GUI应用的架构设计,已经有了Form & Control、MVC,、MVP、 Passive View等多种模式。模式可以帮助我们建立优雅的架构,但前提是弄清楚模式的应用场景。弄清楚GUI应用面临的设计上的问题,有助于我们正确的挑选设计方案。
MongoDB是一种非常易用的NoSQL方案,Brian C. Dilley在这篇文章里介绍了MongoDB的优劣势,并介绍了MJORM项目。MJORM用于MongoDB,是一个没有注解的Java ORM库。
随着网络基础设施的逐步成熟,从RPC进化到Web Service,并在业界开始普遍推行SOA,再到后来的RESTful平台以及云计算中的PaaS与SaaS概念的推广,分布式架构在企业应用中开始呈现出不同的风貌,然而殊途同归,这些分布式架构的目标仍然是希望回到建造巴别塔的时代,系统之间的交流不再为不同语言与平台的隔阂而产生障碍。
2 条回复
关注此讨论 回复