制定性能目标
当您设计和规划智能客户端应用程序时,您应该仔细考虑性能方面的要求,并且定义合适的性能目标。在定义这些目标时,请考虑您将如何度量应用程序的实际性能。 您的性能度量标准应该明确体现应用程序的重要性能特征。请努力避免无法准确度量的模糊或不完整的目标,例如,“应用程序必须快速运行”或“应用程序必须快 速加载”。您需要了解应用程序的性能和可伸缩性目标,以便您可以设法满足这些目标并且围绕它们来规划您的测试。请确保您的目标是可度量的和可验证的。定义良好的性能度量标准使您可以准确跟踪应用程序的性能,以便您可以确定应用程序是否能够满足它的性能目标。这些度量标准应该包括在应用程序测试计划中,以便可以在应用程序的测试阶段度量它们。本 节重点讨论与智能客户端应用程序相关的特定性能目标的定义。如果您还要设计和生成客户端应用程序将消耗的网络服务,则您还需要为这些服务定义适当的性能目 标。在此情况下,您应该确保考虑整个系统的性能要求,以及应用程序各个部分的性能与其他部分以及整个系统之间存在怎样的关系。
性能工具
您可以使用许多工具来帮助您收集和分析应用程序的性能数据。本节中介绍的每种工具都具有不同的功能,您可以使用这些功能来度量、分析和查找应用程序中的性能瓶颈。
注除了这里介绍的工具以外,您还可以使用其他一些选项和第三方工具。
使用性能日志和警报
性能日志和警报是作为 Windows 操作系统的一部分发行的一种管理性能监控工具。它依靠由各种 Windows 组件、子系统和应用程序发布的性能计数器,使您可以跟踪资源使用情况以及针对时间以图形方式绘制它们。您可以使用 Performance Logs and Alerts 来监控标准的性能计数器(例如,内存使用情况或处理器使用情况),或者您可以定义您自己的自定义计数器来监控应用程序特定的活动。.NET CLR 提供了许多有用的性能计数器,它们使您可以洞察应用程序性能的好坏。关系比较大的一些性能对象是:
1).NET CLR 内存。提供有关托管 .NET 应用程序内存使用情况的数据,包括应用程序正在使用的内存数量以及对未使用的对象进行垃圾回收所花费的时间。
2).NET CLR 加载。提供有关应用程序正在使用的类和应用程序域的数量的数据,并且提供有关它们的加载和卸载速率的数据。
3).NET CLR 锁和线程。提供与应用程序内使用的线程有关的性能数据,包括线程个数以及试图同时对受保护的资源进行访问的线程之间的争用率。
4).NET CLR 网络。提供与通过网络发送和接收数据有关的性能计数器,包括每秒发送和接收的字节数以及活动连接的个数。
5).NET CLR 异常。提供有关应用程序所引发和捕获的异常个数的报告。
您的应用程序还可以提供您可以通过使用性能日志和警报轻松监控的、应用程序特定的性能计数器。您可以像以下示例所显示的那样,定义自定义性能计数器:
[C#]
PerformanceCounter counter = new PerformanceCounter( "Category","CounterName", false );
[Visual Basic .NET]
Dim counter As New PerformanceCounter("Category", "CounterName", False)
在创建性能计数器对象之后,您可以为您的自定义性能计数器指定类别,并将所有相关计数器保存在一起。PerformanceCounter 类在 System.Diagnostics 命名空间中定义,该命名空间中还定义了其他一些可用于读取和定义性能计数器和类别的类。
优化显示速度
根据您用于显示用户界面控件和应用程序窗体的技术,您可以用多种不同的方式来优化应用程序的显示速度。当您的应用程序启动时,您应该考虑尽可能地显示简单的用户界面。这将减少启动时间,并且向用户呈现整洁且易于使用的用户界面。而且,您应该努力避免引用类以 及在启动时加载任何不会立刻需要的数据。这将减少应用程序和 .NET Framework 初始化时间,并且提高应用程序的显示速度。当您需要显示对话框或窗体时,您应该在它们做好显示准备之前使其保持隐藏状态,以便减少需要的绘制工作量。这将有助于确保窗体仅在初始化之后显示。如果您的应用程序具有的控件含有覆盖整个客户端表面区域的子控件,则您应该考虑将控件背景样式设置为不透明。这可以避免在发生每个绘制事件时重绘控件的背景。您可以通过使用 SetStyle 方法来设置控件的样式。使用 ControlsStyles.Opaque 枚举可以指定不透明控件样式。您应该避免任何不必要的控件重新绘制操作。一种方法是在设置控件的属性时隐藏控件。在 OnPaint 事件中具有复杂绘图代码的应用程序能够只重绘窗体的无效区域,而不是绘制整个窗体。OnPaint 事件的 PaintEventArgs 参数包含一个 ClipRect 结构,它指示窗口的哪个部分无效。这可以减少用户等待查看完整显示的时间。使用标准的绘图优化,例如,剪辑、双缓冲和 ClipRectangle。这还将通过防止对不可见或要求重绘的显示部分执行不必要的绘制操作,从而有助于改善智能客户端应用程序的显示性能。
如果您的显示包含动画或者经常更改某个显示元素,则您应该使用双缓冲或多缓冲,在绘制当前图像的过程中准备下一个图像。System.Windows.Forms 命名空间中的 ControlStyles 枚举适用于许多控件,并且 DoubleBuffer 成员可以帮助防止闪烁。启用 DoubleBuffer 样式将使您的控件绘制在离屏缓冲中完成,然后同时绘制到屏幕上。尽管这有助于防止闪烁,但它的确为分配的缓冲区使用了更多内存。
IOC技术应用
1) 我们看看我们常用的配置文件应用(对象级的反转)
2) 在设计模式中,我们已经习惯一种思维编程方式: 接口驱动
3) 其实就是javabean的思想,注入和发射思想
17.1.1 IOC的技术结构(面向技术经理和开发人员)
1) XML设置
2) 配置性能和对象还原
3) 反射机制应用方式反射的代价
4) 可配性(替代很多设计模式)
5) 减少硬性编码
DriverManagerDataSource
BasicDataSource
JndiObjectFactoryBean