Welcome

首页 / 软件开发 / .NET编程技术 / CLR全面透彻解析: 及早并经常评量性能,第1部分

CLR全面透彻解析: 及早并经常评量性能,第1部分2011-10-26 msdn Vance Morrison作为 Microsoft® .NET Framework 公共语言运行库团队的性能架构师,帮助大家充分利用运行时 编写高性能的应用程序是我的职责所在。这无论是在 .NET 还是在其他语言中都不神秘——您 只需要在设计之初即考虑应用程序的性能问题即可。有很多应用程序在编写时根本未考虑性能问题。这通 常无关紧要,因为大多数程序的计算量相对较少,而且同和它们交互的人类相比,程序的计算速度要快得 多。遗憾的是,当真的需要程序具有较高性能时,我们却缺乏相关的知识、技能和工具来很好地实现这一 点。

在这里我将讨论编写高性能应用程序所需掌握的内容。我将重点介绍为 .NET 编写的程序,但各种语 言间的概念都是通用的。由于 .NET 对底层机器的抽象程度要比典型的 C++ 编译器高,并且由于 .NET 提供了许多强大但成本高昂的功能(包括反射、自定义属性、正则表达式等),所以很容易在无意中将成 本高昂的操作加入到对性能要求苛刻的代码路径中。为帮助您避免付出这种开销,我将介绍如何量化各种 .NET 功能的开销以使您了解何时应该使用这些功能。

制定计划

正如我所提及的,大多数 程序在编写时都没有充分考虑性能问题,但实际上真的应该为每个项目都制定一个性能计划。您必须考虑 到各种用户方案,并清楚地表达出什么样的性能算是出色、良好或糟糕。然后,根据数据量、算法复杂程 度以及以前构建类似应用程序的经验来决定是否能轻松满足所定义的各种性能目标。对于许多 GUI 应用 程序而言,性能目标比较中庸,无需进行特别设计即可轻松达到至少属于良好级别的性能。在这种情况下 ,您的性能计划即告完成。

如果不清楚是否能轻松满足性能目标,则需要开始制定计划,列出可 能成为瓶颈的方方面面。典型问题方面包括启动时间、批量数据操作和图形动画等。

配置文件数 据处理示例

举个例子可以更具体地说明这一点。我目前正在设计用于处理配置文件数据的 .NET 基础结构。我需要以一种有意义的方式表示出操作系统生成的事件(如页面错误、磁盘 I/O、上下文切换 等)列表。涉及的数据文件通常会比较大;较小的配置文件大约 10MB,而文件大小超过 1GB 的也不稀奇 。

在制定性能计划时,我发现如果仅计算需要在屏幕上重绘的那部分数据集,数据显示不会出问 题;换句话说,就是屏幕“懒散”一些问题不大。遗憾的是,要使 GUI 对象(例如树控件、 列表控件和文本框等)“懒散”一些,需要一些额外的工作。这正是大多数文本编辑器在处理 非常大的文件(比如 100MB)时,其性能让人难以接受的原因。如果在设计 GUI 时不考虑性能,则结果 几乎肯定无法令人满意。

但是,延迟显示对于那些需要使用文件中所有数据的操作(例如,计算 摘要时)并不会有所帮助。鉴于数据集大小的因素,数据分派和处理方法是必须要用心设计的“热 ”代码路径。程序的其他部分可能对性能没有严格要求,因此不需要特别关注。

这种情况非 常具有代表性。甚至在需要高性能的方案中,应用程序的 95% 都不需要任何性能计划,但您需要认真考 虑需要性能计划的最后 5%。而且,根据我的经验,要确定程序中需要认真考虑其性能的 5% 一般都非常 容易。