[转载]如何提高.NET Compact Framework应用程序的性能

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

使用 Windows 窗体和图形节省内存
  • 对提供 BeginUpdateEndUpdate 方法的控件使用这两种方法,提供这两种方法的控件包括 ComboBox、ListBox、ListView、ToolStripComboBox 和 TreeView。

  • 重新定位控件时,使用 SuspendLayout 和 ResumeLayout 方法。

  • 在后台加载其他窗体,使用数据来填充控件,然后再使用 Show 方法。

  • 将事件处理代码限制为仅执行重要任务,以便挂起过程可以继续。

  • 使用脱屏位图。有关示例,请参见如何:绘制后台图像。

  • 重写控件上的 OnKeyDown、OnKeyPress 和 OnKeyUp 方法,而不是添加按键事件处理程序。

使用数据和字符串节省内存
  • 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 和托管对象之间转换,如 PtrToStructure、PtrToStringBSTR、GetObjectForNativeVariant 和 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

[转载]如何提高.NET Compact Framework应用程序的性能 - 黎波 - 博客园

转载于:https://www.cnblogs.com/joeyliang/archive/2007/10/22/933649.html

[转载]如何提高.NET Compact Framework应用程序的性能 - 黎波 - 博客园相关推荐

  1. 转载:利用正则表达式排除特定字符串 - 薰衣草的旋律 - 博客园

    转载:利用正则表达式排除特定字符串 - 薰衣草的旋律 - 博客园 https://www.cnblogs.com/wangqiguo/archive/2012/05/08/2486548.html 阅 ...

  2. Microsoft .NET Compact Framework 开发常见问题解答 - 专注.NET技术及其相关应用开发! - 博客园...

    Microsoft .NET Compact Framework 开发常见问题解答 发布日期: 3/30/2005 | 更新日期: 3/30/2005 Microsoft .NET Compact F ...

  3. 【转载】windows 如何一键关闭所有进程程序 --- (博客园 - 木人子韦)

    [转载]Windows 如何一键关闭所有进程程序 --- (博客园 - 木人子韦) 1.桌面创建一个快捷方式,点击鼠标右键跳出的菜单=> 新建=>快捷方式 01 在"请键入对象的 ...

  4. 博客园的神回复,程序猿的奇葩神回复[连载][二]

    在上一篇(博客园的神回复,一起看看那些IT男的神回复[连载][一])中(ps: 这篇博客之所以改名是因为这次的神回复里有程序媛,所以用IT男不太合适),博客园神回复还是挺受欢迎的,上一篇博客的神回复取 ...

  5. 经典SQL语句大全-【转载自】博客园,作者博客:YuBinfeng's Technology Blog

    因最近学习MySQL,闲来无事逛帖子时,发现这篇较为经典的博客,特转载以防备用学习,同时希望也可以帮到他人,废话不多说,进入正文  一.基础 1.说明:创建数据库 CREATE DATABASE da ...

  6. 回答阿里社招面试如何准备,顺便谈谈对于Java程序猿学习当中各个阶段的建议 - 左潇龙 - 博客园...

    引言 其实本来真的没打算写这篇文章,主要是LZ得记忆力不是很好,不像一些记忆力强的人,面试完以后,几乎能把自己和面试官的对话都给记下来.LZ自己当初面试完以后,除了记住一些聊过的知识点以外,具体的内容 ...

  7. 程序员为什么值得写博客

    Hire Great Writers 仿佛这是写给自己看的,不过这在其中也有着相当有趣的意义 .虽然自己算是一个能写的人,或许这算是一种不算才华的才华,写博文的意义通常不会在于去描述自己怎样,怎样.通 ...

  8. 蛙蛙推荐:一个程序员2012年技术学习总结 - 蛙蛙王子 - 博客园

    蛙蛙推荐:一个程序员2012年技术学习总结 - 蛙蛙王子 - 博客园 蛙蛙推荐:一个程序员2012年技术学习总结 - 蛙蛙王子 - 博客园 俗一吧,也总结一下,程序员,代码说话. posted on ...

  9. 同样的文章2个网站2种待遇,2个眼光,博客园是逼我走、程序员网站是请我过去,这就是人才在不同公司的待遇一样的道理

    昨天晚上很热血的写了两篇文章,结果一个被博客园强制撤下首页. 今天被CSDN网站发布到首页,为我免费做广告,http://www.csdn.net/, 同时给我上了2个首页. C# ASP.NET 开 ...

最新文章

  1. Yolov3 的 OneFlow 实现
  2. php 安装oracle扩展,win PHP7安装oracle扩展
  3. 关于xml的模糊查询问题
  4. 数字开头的正则表达式_初学Web前端要注意什么 正则表达式是怎么回事
  5. linux 无线网卡连接网络连接不上去,【已解决】Ubuntu 10.04 无线网卡 无法连接
  6. java造型_java造型_java向上造型有什么作用为什么要造型有什么效果_彩妆阁
  7. 20-50k,杭州小影科技社招
  8. Python_生成器Generator
  9. 文档布局分析 扭曲文档图像恢复
  10. Java实现mds降维_MDS降维方法的目标是要找到数据的低维表示,使得:
  11. linux tar文件夹打包不包含目录,tar打包如何不打包某一个文件夹(排除某些文件夹)...
  12. 分仓软件是什么?资管分仓的作用
  13. java实现正态分布累积分布,标准正态分布变量的累积概率分布函数
  14. CTF杂项小结--沙窝李的王
  15. ZYNQ PS部分简介
  16. 8086汇编(5、进位加法)
  17. 响铃:互金信贷的明天,或是一场一站式金融服务的盛宴
  18. 冯·诺依曼结构计算机的存储器和数据
  19. 数据库原理与应用实验指导书 实验一:熟悉SQL Server 2012数据库管理系统
  20. DaVinci:播放相关

热门文章

  1. 计算机应用软件用着总是闪退是什么原因
  2. ASP.NET上传一个文件夹
  3. java+上传文件夹
  4. Saladict 沙拉查词
  5. mysql out of range,mysql保存数据提示:Out of range value for column错误
  6. 敏捷项目管理敏捷工作之冲刺计划
  7. Efficient Methods for Natural Language Processing: A Survey自然语言处理有效方法综述
  8. ClasspathResource路径问题解决
  9. 听歌识曲算法技术[语音识别]
  10. 华为路由器MPLS VPN综合实验