软件开发的家园,编程爱好者的天地.

现在是:北京时间 2016/4/14 上午11:50:51 星期四

设为首页  |  加入收藏  |  网站地图

当前位置: 第八基地首页 > asp.net > Framework >
高性能托管应用程序设计入门
发布于:第八基地 来源:互联网 作者:天堂路上 时间:2016-04-27 点击:271
我们可以将软件开发过程比作玩杂耍。通常,人们在玩杂耍时至少需要三件物品,而对于可以使用的物品数量并没有任何限制。刚开始学习如何玩杂耍时,您会发现在接球和抛球时您看到的是单个的球。随着熟练程度的增加,您会开始将注意力集中在这些球的运动上,而不是集中在每个单个的球上。当您掌握了玩杂耍的方法时,您就会再次将注意力集中在单个球上,一边努力使这个球保持平衡,一边继续抛出其他的球。凭直觉您就可以知道这些球的运动方向,并且也总是能将手放在正确的地方接球和抛球。可是,这与软件开发又有什么类似之处呢?

不同的角色在软件开发的过程中会“耍弄”不同的三件物品:项目和程序管理人员耍弄的是功能、资源和时间,而软件开发人员则耍弄正确性、性能和安全性。人们在玩杂耍时总是试图使用更多的物品,但只要是学过杂耍的人都会知道,即使只添加一个球都会让在空中保持所有球的平衡变得更加困难。从技术上讲,如果耍弄的球少于三个,那根本就不叫杂耍。作为软件开发人员,如果您不考虑正在编写的代码的正确性、性能和安全性,则说明您根本就没有投入到您的工作中。当您刚刚开始考虑正确性、性能和安全性时,您会发现您每次只能将注意力集中在一个方面。当它们成为您日常工作的一部分时,您会发现您再也不需要将注意力集中在某一个特定的方面,因为此时它们早已融入了您的工作。而一旦掌握了它们,您就能够凭直觉进行权衡,并相应地调整自己的注意点。这就跟玩杂耍一样,关键在于实践。

编写高性能的代码本身也存在三件物品:设置目标、测量和了解目标平台。如果您不知道代码必须达到的运行速度,那么您又如何知道您完成了呢?如果您不测量和分析代码,那么您又如何知道您已经达到了目标,或为什么没有实现目标呢?如果您不了解目标平台,那么当您没有实现目标时,又如何知道要对什么进行优化呢?这些原则对所有的高性能代码开发过程几乎都适用,不管您以哪种平台作为目标平台都一样。要完成一篇有关编写高性能代码的文章,就必须提到以上这三个方面。虽然这三个方面都同等重要,但是本文的重点在于后两个方面,因为它们适用于编写以Microsoft?.NETFramework作为目标平台的高性能应用程序。

在任意平台上编写高性能代码的基本原则为:

1、设置性能目标
2、测量,测量,再测量
3、了解应用程序的目标硬件和软件平台

.net公共语言运行库
.NETFramework的核心是公共语言运行库(CLR)。CLR为您的代码提供所有的运行时服务:实时[Denver1]编译、内存管理、安全性和大量其他服务。CLR的设计考虑了高性能的要求。也就是说,您既可以充分利用其性能,也可以不发挥这些性能。
本文将从性能的角度概要介绍公共语言运行库,找出托管代码性能的最佳办法,还将展示如何测量托管应用程序的性能。本文并不打算对.NETFramework的性能特点进行全面讨论。根据本文的目的,文中提到的性能方面的内容将会包括吞吐量、可扩展性、启动时间和内存使用量等。
托管数据和垃圾回收器
在以性能为中心的应用程序中使用托管代码时,开发人员最关心的问题之一就是CLR内存管理的开销-这种管理由垃圾回收器(GC)执行。内存管理的开销由与类型实例关联的内存的分配开销、在实例的整个生命周期中内存的管理开销以及当不再需要时内存的释放开销计算得出。
托管分配的开销通常都非常小,在大多数情况下,比C/C malloc或new所需的时间还要少。这是因为CLR不需要通过扫描可用列表来查找下一个足以容纳新对象的可用连续内存块,而是一直都将指针保持指向内存中的下一个可用位置。我们可以将对托管堆的分配看作“类似于栈”。如果GC需要释放内存才能分配新对象,那么分配可能会引发回收操作。在这种情况下,分配的开销就会比malloc和new大。固定的对象也会对分配的开销造成影响。固定的对象是指那些GC接到指令在回收操作期间不能移动其位置的对象,通常是由于这些对象的地址已传递到本机API中。

上一篇:什么是架构
对我有帮助
(0)
0%
对我没帮助
(0)
0%
返回顶部
在线反馈
在线反馈