惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

阮一峰的网络日志
阮一峰的网络日志
D
Darknet – Hacking Tools, Hacker News & Cyber Security
S
Schneier on Security
The Last Watchdog
The Last Watchdog
Cyberwarzone
Cyberwarzone
S
Securelist
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
C
Cyber Attacks, Cyber Crime and Cyber Security
L
Lohrmann on Cybersecurity
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
The Cloudflare Blog
V
V2EX
博客园_首页
博客园 - 聂微东
Vercel News
Vercel News
人人都是产品经理
人人都是产品经理
G
GRAHAM CLULEY
T
Tenable Blog
Last Week in AI
Last Week in AI
Y
Y Combinator Blog
L
LINUX DO - 最新话题
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
SecWiki News
SecWiki News
博客园 - 三生石上(FineUI控件)
S
Secure Thoughts
N
News | PayPal Newsroom
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
T
Troy Hunt's Blog
博客园 - 【当耐特】
Forbes - Security
Forbes - Security
H
Hacker News: Front Page
A
About on SuperTechFans
B
Blog RSS Feed
Engineering at Meta
Engineering at Meta
MongoDB | Blog
MongoDB | Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
罗磊的独立博客
D
DataBreaches.Net
P
Privacy & Cybersecurity Law Blog
Schneier on Security
Schneier on Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
Google DeepMind News
Google DeepMind News
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
Jina AI
Jina AI
D
Docker
P
Proofpoint News Feed

博客园 - 追忆似水年华

dotNet平台下的SNS软件的比较与选用(一) 对于IM市场的思考 杂谈DNN - 追忆似水年华 - 博客园 点评顾雏军 - 追忆似水年华 - 博客园 我要开始研究DNN了 关于《民工》 张纪中 vs 管虎 呵呵,msn7的端口修改了。 C#实现的根据年月日计算星期几的函数 记得有人说过,人生有两大欢乐,一是拥有后可以细细品味,二就是追求之中的备感充实。 install sheild调用外部函数(在dll内) 谁用过 install shield x 呀,我遇到麻烦了. 不好意思 又来问问题了. 忽然想起了刘伶 忽然想起我读书时 写的两句话 用vs制作安装程序的时候 如何获取用户输入的序列号,并进行判定 关于向页面注册javascript的技术 我读《Microsoft .NET框架程序设计(修订版)》------DoItNow的读书笔记7 也谈const VS readonly 关于键盘模拟的问题 发现了MSDN的两个错误 不知道大家的看法如何
我读《Microsoft .NET框架程序设计(修订版)》------DoItNow的读书笔记6
追忆似水年华 · 2004-06-25 · via 博客园 - 追忆似水年华

关于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了