我读《Microsoft .NET框架程序设计(修订版)》------DoItNow的读书笔记6

关于String和StringBuilder的使用
前些天作一个项目 需要安装客户提供的Excel样式,打印输入同样的报表(初接项目时 巨汗),后来与同事探讨打算 以原Excel作为模板, 然后读入此Excel的全部内容(包括样式等信息) 在程序后台 对此Excel每个cell内的内容 通过读取数据库进行替换. 最后再把替换后的 Excel 文件 通过Response刷向客户端. ----呵呵,这绝对是一个很好的创意(否则,如何才能保证和客户要求的Excel样式完全一样?).

写了个模板读取引擎(其专门负责读取客户提供的Excel文件) ,最初 读取后的数据存放在一个string中,然后每次 利用string的Replace方法逐一替换数值. 要知道客户交给我们的Excel文件有5个多k大小. 其中要替换900次. 这个有点危言耸听把 呵呵. 当我还没有替换完成 系统就崩溃了. 有副图片大家可以看看

内存从300多M一路上杨到800多M, 然后突然崩溃(就在内存突然降低处).

看来这个方法不行. 然后想到了StringBuilder, 这次把模板引擎读取的数据直接保持在StringBuilder中,然后调用StringBuilder的Replace方法进行 这900次替换.  呵呵 看看内存的使用情况把


从图上可以清楚地看出在cpu100%运行的地方内存甚至还有所下降(不知道为什么会下降,我执行了号几次都是内存会下降 --我怀疑每每在此时都有内存收集).

现在改轮到解释一下 这种现象的本质了:
string对象一旦创建 便会在内存中”稳定”的存在.他的大小长度永远不会被改变. 比如你使用
string s=”Hello”;
s.ToLower();
那么会是这杨,首先在内存中创建一个字符川s, 然后当你ToLower()的时候, 一个小写的”hello”会是重新分配一块内存, 而这块内存与 小s占用内存已经没有任何关系了.  在我的第一段程序中,这900次替换 每次都要 重新分配一次内存 . 而分配内存的过程是要好用时间的. 同时新内存分配后,旧内存并没有实时释放, 所以会出现 系统崩溃的情形了.

而StringBuilder就不同了, StringBuilder每次Replace的时候 都是在他自己本身上进行的. 不需要另外分配内存 这样季不占有内存分配时的时间 也不占有内存空间.所以会出现 下面一副 比较”赏心悦目”的图了.

由此可见,操作大的字符串,尤其是 在字符串上频繁的有操作时 尤其应该使用StringBuilder了

posted on 2004-06-25 18:48  追忆似水年华  阅读(575)  评论(0编辑  收藏  举报

导航