昨儿蹲坑的时候突然接到测试妹子夺命连环call,说项目导出的csv文件卡得跟便秘似的。五百兆数据愣是导了十分钟,客户在会议室摔杯子了。
一、撸起袖子查代码
打开祖传代码一看差点喷咖啡:每个字段都在循环里new StreamWriter!这跟拿挖耳勺运沙有啥区别?随手掏出性能分析器跑了下,好家伙,89%时间耗在创建文件流上,硬盘灯闪得跟迪厅蹦迪似的。
- 每写入一行就开/关文件流
- 没设buffer直接裸奔
- *8反复实例化
二、重构踩坑实录
立马把StreamWriter拎到循环外面。刚以为稳了,测试数据却报乱码。原来忘记带Encoding参数,系统默认编码把中文整成外星文。补上using(var sw = new StreamWriter(path,true,*8))重新跑,速度从十分钟缩到三分钟。
接着跟同事打赌bufferSize有没有用。先试了默认4KB,每秒写12MB数据。后来改参数玩疯球了:
- 64KB时硬盘灯终于不抽风
- 512KB时CPU占用从98%降到35%
- 2MB后速度反而下降
最终在128KB时找到甜蜜点:五百兆文件53秒搞定,内存占用稳如老狗。
三、血泪经验包
现在团队规范加了两条铁律:
- StreamWriter必须套using自动关门
- 超过万行数据强制设BufferSize
- 所有文本文件显式声明Encoding
搞完优化去茶水间嘚瑟,发现测试妹子工位空了——原来早上摔杯子的客户是她爸。这倒霉孩子昨天刚转正,今天就被亲爹吓辞职了。