.NET Framework 开发人员指南——如何:提高性能


 

MSDN仍然是最全面的知识库。

今天编写一个.NET CF 下的程序,为了尽可能的提高程序的性能,又搜索了到下面这篇文档,其实,微软告诉了我们很多有效的技巧。

温故而知新啊!

如何:提高性能

以下编程做法可以节省内存和改善设备应用程序的性能。

使用 Windows 窗体和图形节省内存
使用数据和字符串节省内存
  • 在 for 循环中使用整数变量(Int32 或 Int64),而不使用对象变量。

  • 避免使用枚举的 ToString 方法,因为它会搜索元数据表,从而影响性能。

  • 避免 OutOfMemoryException 错误。如果没有足够的内存分配给内部使用或分配给新对象实例,公共语言运行库可能会引发此异常。要避免此异常,应避免编写占用 64K 或更多内存的大方法。

  • 移除 System.SR.dll,它包含异常对话框的错误信息字符串。部署应用程序时可以不使用此文件,从而节省内存。如果存在 System.SR.dll,则 .NET Compact Framework 将动态加载 System.SR.dll 中包含的错误字符串。

    如果设备中不存在此 .dll 文件,则所有异常都包含消息“无法加载资源程序集”。不过,在开发期间将 System.SR.dll 引用添加到 Microsoft Visual Studio 2005 项目中总是有用的,因为这样您将看到有意义的异常。

  • 字符串是不可变的,因此,每次修改该字符串时都会创建新的 String 对象。构造需经常修改的字符串时,请考虑使用 StringBuilder

  • 如果您知道用于 DateTime 序列化的确切格式,请为 DateTime 使用 ParseExact 方法。否则,DateTime 分析器将按顺序尝试应用多个特定于区域性的格式。

  • 限制打开 SqlCeCommand 对象的数量,并在完成后释放它们。

与本机代码进行交互时节省内存
  • 在平台调用操作中,使用可直接复制到本机结构中的类型,这样的类型在托管和非托管内存中有一种通用表示形式,如 Int32 或 IntPtr。对于大于 32 位的可直接复制到本机结构中的值类型来说,通过引用传递比通过值传递更快。有关可直接复制到本机结构中的类型的更多信息,请参见 .NET Compact Framework 中可直接复制到本机结构中的类型

  • 为函数签名中的参数使用 InAttribute 和 OutAttribute 属性可以减少不必要的封送处理。

  • 使用 Marshal 类中的方法手动在 IntPtr 和托管对象之间转换,如 PtrToStructurePtrToStringBSTRGetObjectForNativeVariant 和 GetObjectForIUnknown

  • 使用 Prelink 和 PrelinkAll 方法来引发支持本机到托管调用的存根 (stub) 的 JIT 编译。

  • 如果期望您的本机 COM 对象通常情况下返回 S_FALSE,或其他非 S_OK HRESULT 值,则应将 PreserveSig 字段设置为 true,并使托管签名与本机签名匹配。这就避免了运行库将 HRESULT 值转换为 COM 调用上的异常时必需的 try/catch 块的系统开销。

  • 尽量使用一个平台调用多做工作,尽量少用多个调用。

在集合中节省内存
  • 如果集合基于数组,请使用索引器。

  • 一旦有机会,就指定集合的大小,因为动态调整大小可以大大增加额外的存储。

  • 使用泛型集合以避免值类型的装箱和取消装箱产生的系统开销。定义您自己的优化集合可实现最佳性能。

在 XML 中节省内存
  • 使用 XmlTextReader 和 XmlTextWriter 代替 XmlDocument(因为它占用的内存较多)。

  • 指定 XmlReaderSettings 和 XmlWriterSettings 的设置以改善性能。如果 IgnoreWhitespace 和 IgnoreComments 两个属性值适用,它们可以显著改善性能。

  • 使用 UTF-8、ASCII 和 UTF-16 字符编码,它们比 ANSI 和 Windows 代码页编码更快。

  • 避免使用用于分析的架构,因为这种架构需要更多的验证工作。

  • 当从 XML 源填充 DataSet 窗体时,应将列映射为属性并使用类型化 DataSet

  • 填充 DataSet 时,应避免填充以下各项:

    • 架构推理。

    • 嵌套表。

    • 多个 DateTime 列。为了获得更好的性能,请使用 Ticks 属性值。

  • 使用 XML 反序列化时,遵循以下准则可改善性能:

    • 使元素和属性名尽量保持简短,因为每个字符都必须经过验证。

    • 基于属性数据的 XML 比基于元素数据的 XML 要快。

    • 如果适用,使用 System.Xml.XmlNodeReader.Skip 方法。

    • 如果性能很重要,应考虑二进制序列化。

  • 为 XML 序列化的每一种类型分别使用一个 XmlSerializer 实例,以减少用于搜索元数据的时间。

  • 由于序列化大量 XML 可能会耗尽内存,应考虑通过使用 BinaryReader 和 BinaryWriter 生成自定义二进制序列化机制。

使用 Web 服务时节省内存
  • 读取和编写 DataSet 时,应使用 DiffGram。有关更多信息,请参见 DiffGram

  • 以 XML 格式将远程 DataSet 及其架构保存到设备。

  • 初始屏幕期间创建一个简单的 Web 服务方法调用,因为第一个调用比后面的调用要慢。

  • 小心处理网络和数据错误。

  • 某些情况下,可以手动将 DataSet 序列化为 XML 字符串,然后执行一个 Web 服务调用,这样可以提高性能。

在高级编程中节省内存
  • 异步处理大操作。

  • 避免虚拟调用。.NET Compact Framework 运行库虚拟调用比静态调用或实例调用大约慢 30%。由于资源受约束,.NET Compact Framework 不使用 vtable,因此必须通过转换类和接口层次结构来调用方法,但这是一种代价很高的操作。.NET Compact Framework 维护已解析的虚拟调用的缓存,因此在大多数情况下,无须重新解释调用。

  • 尽可能使用字段而不使用属性。

  • 定义值类型时,重写 GetHashCode 和 Equals 方法。如果未重写它们,则运行库会在基 ValueType 类中使用这些方法的普通版本。

  • 谨慎使用映射。出于调研目的将映射与非实例化类一起使用会影响应用程序中的实例化对象的性能。

  • 确保 RESX 文件中的托管资源具有完全限定名,并且这些资源准确无误。它们必须具有正确的版本和 PublicKeyToken 字段。为未正确指定的类型查找最合适的替代类型会影响性能。

  • 请注意,在某些情况下,直接从文件读取应用程序数据就足够了,这比使用 ResourceManager 效率更高。ResourceManager 可以在定位您的二进制资源之前在文件系统中探测多个位置来查找最匹配的附属程序集。为作业使用适当的工具。

http://msdn2.microsoft.com/zh-cn/library/1766918e(VS.80).aspx





本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/sgsoft/archive/2007/07/05/807685.html,如需转载请自行联系原作者

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
.NET Framework 4.0 常用类库参考手册 [微软官方 MSDN] MSDN Library - .NET Framework 4.0 - 命名空间 (节选版) 制作成了chm格式,方便离线状态下学习! ======================================= 原文地址:http://msdn.microsoft.com/zh-cn/library/ms229335.aspx ======================================= .NET Framework 类库 - 命名空间 (节选版) Microsoft.Win32 提供两种类型的类:处理由操作系统引发的事件的类和对系统注册表进行操作的类。 System 包含用于定义常用值和引用数据类型、事件和事件处理程序、接口、特性和处理异常的基础类和基类。其他类提供支持下列操作的服务:数据类型转换,方法参数操作,数学计算,远程和本地程序调用,应用程序环境管理以及对托管和非托管应用程序的监管。 System.Collections 包含定义各种对象集合(如列表、队列、位数组、哈希表和字典)的接口和类。 System.Data 包含组成大部分 ADO.NET 结构的类。ADO.NET 结构使您可以生成可用于有效管理来自多个数据源的数据的组件。 System.Data.Common 包含由 .NET Framework 数据提供程序共享的类。.NET Framework 数据提供程序描述用于在托管空间中访问数据源(如数据库)的类的集合。 System.Data.Linq 包含支持在 LINQ to SQL 应用程序中与关系数据库进行交互的类。 System.Data.Linq.Mapping 包含用于生成表示关系数据库的结构和内容的 LINQ to SQL 对象模型的类。 System.Data.Mapping 提供用于存储数据映射信息的类型。 System.Data.Metadata.Edm 包含一组类型,这些类型表示模型中由实体框架使用的概念,以及一组帮助应用程序使用元数据的类。 System.Data.Objects 包含可访问对象服务的核心功能的类。 System.Data.Objects.DataClasses 包含以下这些类:Entity Data Model (EDM) 中定义的类型的基类、由导航属性返回的类型的基类,以及用于定义将公共语言运行时 (CLR) 对象映射到概念模型中类型的特性的类。 System.Data.Sql 包含支持特定于 SQL Server 的功能的类。此类的 API 扩展已添加到 SQL Server 的 .NET Framework 数据提供程序 ( System.Data.SqlClient) 中。 System.Data.SqlClient 包含封装 SQL Server .NET Framework 数据提供程序的类。SQL Server .NET Framework 数据提供程序描述了用于在托管空间中访问 SQL Server 数据库的类集合。 System.IO 包含允许对数据流和文件进行同步和异步读写的类型。 System.Linq 包含支持使用语言集成查询 (LINQ) 的查询的类和接口。 System.Web 提供启用浏览器/服务器通信的类和接口。 ……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值