您的位置:首页 > 编程语言 > PHP开发

(IV).NET CF二进制文件操作+ SmartPhone开发思考

2004-10-23 04:51 218 查看
刚才对.NET CF内部的代码的分析得知,FileStream.Position对性能有严重的损耗,那么我们如何去解决的这个问题呢?

1、如果你可以自行计算当前位置,那是最好的了。比如for(int i = 0; i < fs.Length; i++),或者有一个count变量自行累加,然后通过while(count < fs.Length)来进行循环。
2、如果上面一个条件无法达成,那么可以考虑使用上文所示代码,用MemoryStream来进行间接读取。虽然需要从文件搬到内存,然后再进行读取操作,看起来绕了一圈,但是实际效率还是相当不错的。
3、如果文件超出内存能够承受的范围,那么只好自己编写一些更加复杂的代码了。比如一小段一小段的用MemoryStream来读取,或者自己写一个替代FileStream的类。

也许大家会困惑,难道还有情况不方便进行当前位置的计算吗?不方便的情况其实还是有的,最简单的比如BinaryReader.ReadString(),这个函数读取了多少个字节取决于编码的方式,以及该字符串的长度。由于它使用了一个7BitEncoding的方式来压缩字符串长度信息,因此整个字符串到底占用了多少文件空间还不是一件特别简单的事情。具体的代码可以自己看一下BinaryReader/BinaryWriter里面的Read/Write7BitEncodedInt函数,简单点讲就是,如果该字符串所占字节数n(注意不是字符串当中字符的个数)小于等于0x7f,则为1+n个字节;小于等于0x3fff,则为2+n;小于等于0x1fffff,则为3+n;小于等于0xfffffff,则为4+n;否则是5+n。另外一种比较罕见的情况是,你需要把这个FileStream交给一个你不认识的模块去处理,因此你无法得知读取了多少字节,也无法保证当前读取位置是否已经被强行修改了。关于如何处理这些问题,相信是见仁见智了。

写到这里,我就不断感叹,CE上面的资源是在是少得可怜(相对于桌面来说),尤其是SmartPhone。其实一个项目的开发过程,还是需要考虑到一些技术细节。也许每一个阶段考虑的范围不一样,例如最初的阶段我们首先需要解决领域模型的东西,这个时候我们不能够被技术细节所束缚,不能够因为我们希望使用.NET CF所以我们不解决某个需求等等。但是随着进度的推进,技术细节就开始逐渐地进入了我们的视野,我们绝对不能够视而不见的。举一个例子,如果老板说,我们要进行一个单片机开发,片上内存4-8k,最多的片外内存是64k,那么一切关于OO的东西几乎就是瞎掰。
当然,反过来的极端也是不可取的。如果在比较开始的阶段就过分的考虑技术细节也是不正确的,例如Xml可以为我们的开发工作提供方便,它的强大的描述能力和简单明了的格式,使得我们希望产生某些数据变得相对简单,那么为什么我们要舍去不用呢?一开始就专门开发一种工具,也许就会限制你的思路,因为可能你会觉得有效率问题,所以所有扩展性都是奢侈的部分。最后其实一个依赖于扩展性的项目却因为一开始设计的文件格式不支持,而无法完成开发,那这个代价就太大了。其实目前我遇到的情况是使用了Xml之后发现性能上面有非常严重的问题,但是相对来说还是比较庆幸当初使用XML作为数据的载体。因为开发过程确实比较轻松快捷,而且也拓宽了我们的思路,发现原来有些东西确实考虑的不周到,也搞清楚了一些原来毫无概念的东西。那么现在怎么办呢?技术问题相对于设计问题还是比较好解决的,比如说我们可以做一个简单的XML->特殊二进制格式的转化工具,就能够极大地提升性能。目前对于6000项数据的完整遍历,大概在19秒的级别,再加上一些其他的优化手段,目前能够达到3秒左右的级别,基本上属于可以接受的范围。(从197秒到3秒,提升幅度还是比较夸张的。)

写着写着就回忆起以前写自己的文件格式,现在还是念念不忘,后来逐渐认识到随着主流软硬件系统的性能提升,一些比较简单但是相对低效的文件格式比如Xml(不过我用Xml的机会非常少,几乎就是没有用过),其效率也慢慢变得可以接受,就不再愿意去做这种费时费力的事情了。没想到今天还是要开发一种特殊的二进制格式,感觉又回到了过去386之前的时代了……640k的物理限制,40MHz的CPU……其实现在在手机上用.NET CF开发也好不到哪里去,还是要不断的优化优化再优化。幸好以前在这些方面还是有一定的基础,不然真是手忙脚乱了。

p.s.: 会不会有人说,你的197秒怎么来的,在我这里才20秒不到的样子。呵呵,那我估计你是在P4 2.8(HT) 1G内存或者以上的机器上跑的模拟器吧?模拟器在大吞吐量方面的操作要比真实手机要快10倍左右,比如这种大量的文件读写操作。但是如果是普通的密集运算,两者就几乎不相上下了,甚至有可能手机还要快一点(比如启动的时候)。

今天就到这里吧,下次再写。(唉,明知道周末人看的人少,还那么努力不知道为什么……)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: