在基于Windows Mobile应用程序中存储管理的最佳策略[翻译]
起源: 前几天编了个小程序,要将一个文本文件放到数组中,虽然都读进去了,但是后来运行出错无法搜索文件的后面部分,弄了半天才发现原来是运行的时候内存不足,故把数组都改为动态申请,后面就 OK了. 于是,不得不考虑内存的使用以及运行效率的问题.前几天在微软的MSDN上看到Windows Mobile SDK的更新文档(即使我在8月初期就看到了微软MSDN上的更新,当时只是看到了一些),发现了以下的文章,把他翻译成中文:
(翻译不对的地方,还请多多指教)
Best Practices for Managing Storage in a Windows Mobile-based Application
存储硬件和整体的系统设计对存储的性能影响很大.目前,Pocket PC设备使用基于RAM的文件系统,而Smartphone设备使用基于闪存(falsh)的永久存储文件系统.想对存储硬件技术有更深的理解,可以看:
System Memory Management in Windows CE .NET
存储硬件性能考虑
下表是基于闪存(Flash)的永久存储文件系统与基于RAM的文件系统的各种操作性能的相关比较:
操作 | 基于Flash | 基于RAM |
---|---|---|
局部读 | 较慢 | 较快 |
局部写 | 很慢 | 较快 |
网络(Network)读 | 较快 | 较慢 |
网络写 | 较快 | 较慢 |
是否有备份电池硬件 | 否 | 是 |
永久注册表? | 比基于RAM更优越 | 是 |
存储软件性能的最佳策略
遵循以下的最佳策略能够帮助您最小化任何的性能影响, 为此您的应用程序必须:
-
(1) 最小化应用程序的大小,即应用程序要尽可能的小
-
(2) 最小化永久存储数据的数量。 由于文件系统的资源可能是有限的,所以必须确保您的应用程序能够容忍并不总是运行的存储系统。
-
(3) 最小化更新数据的频率。不要经常更换数据。
-
(4) 最小化任何对注册表的周期性的写。不要经常对注册表进行写操作。
-
(5) 最小化动态链接数据库(DLLs)的数量。如果不是经常调用,动态加载库比静态加载库更为优越,但要记住的一点是当你使用完动态链接库后,记得要卸载,释放动态链接库。
-
(6) 最小化循环检测。使用事件驱动设计,能够使您的应用程序检测到所需要的任何变化,而不是使用while循环语句来检测。
运行少量的代码。代码在ROM中是压缩存储的,因此在代码能够运行之前,代码必须先解压。而对代码进行解压影响性能。比如:在一个典型的Smartphone开发平台,解压一页的代码需要3毫秒(ms)。另外,代码执行要消耗电源,除非绝对需要(必须),尽量不运行代码。 -
(7) 只在合适的时候运行代码。例如:当应用程序对用户来说不可见的时候,停止它的活动。
-
(8) 最小化对闪寸硬件的读写。在一个典型的Smartphone开发平台,往闪存硬件中写一页的代码需要83毫秒(ms)的时间。用尽可能地往RAM中写数据,来取代往闪存里写(注:由上一部分的表格可知,往RAM中进行局部写要比往闪存中写快)。如果对闪存的写是不可避免的,那么应该尽可能地推迟写的时间。对闪存的写比对RAM的写要花费更多的电量,因此尽可能地减少对闪存的写以达到减少电量消耗的目的。
-
(9) 尽可能地把驱动程序标记为可调页的(Pageable)。只要驱动程序在挂起或恢复的期间不运行,并且驱动程序没有在维护页错误(缺页?),我们就可以把驱动程序标记为可调页的。RAM包含所有可调页的驱动程序和DLL文件。在启动的时候,所有的不可调页的驱动程序和DLL文件必须被解压进RAM。(注:而上文中说到解压需要时间的)
原文:http://msdn.microsoft.com/library/default.asp?url=/library/en-us/mobilesdk5/html/moconbestpracticesformanagingstorageinwindowsmobileapplication.asp