记录这篇文章的灵感来源来自今天下班前与同事的小小争论,我现在开发的一个项目中,有这样一段代码:

public string ToXML(){string strXml = string.Empty;try{MemoryStream ms = new MemoryStream();XmlSerializer xml = new XmlSerializer(this.GetType());xml.Serialize(ms, this);byte[] arr = ms.ToArray();strXml = Encoding.UTF8.GetString(arr, 0, arr.Length);return strXml;}catch{return "";}}

  同事说象MemoryStream这类资源,应该用using包起来自动释放资源,否则会有内存泄漏问题。在using的使用上,我也同意应该使用using,但由于这类风格的代码在原项目中非常多(有一部分历史原因),如果一一修改,工作量太大,时间不允许。于是我就在内心评估:如果不改,现在这种代码的风险到底有多大?

我想很多人都知道using(Resource res = new Resrouce){},其实相当于

Resource res = new Resrouce

try{}

catch{}

finally{res.Dispose();}

对比与现有代码的区别,无非就是资源没有调用Dispose()释放,但是CLR有强大的GC(垃圾回收)机制,方法调用完成后,方法体中创建的托管资源如果不再被使用,也一并会被GC列为可回收对象,所以就算开发人员没有手动调用Dispose,其实CLR也会帮我们做这件事情,只是时机可能会晚一些而已。

于是有了下面的测试:

1.先创建一个示例用的Class

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Serialization;namespace Model
{public class SampleClass{public string Name { set; get; }public string ToXMLNoUsing(){string strXml = string.Empty;try{MemoryStream ms = new MemoryStream();XmlSerializer xml = new XmlSerializer(this.GetType());xml.Serialize(ms, this);byte[] arr = ms.ToArray();strXml = Encoding.UTF8.GetString(arr, 0, arr.Length);return strXml;}catch{return "";}}public string ToXMLWithUsing(){string strXml = string.Empty;try{using (MemoryStream ms = new MemoryStream()){XmlSerializer xml = new XmlSerializer(this.GetType());xml.Serialize(ms, this);byte[] arr = ms.ToArray();strXml = Encoding.UTF8.GetString(arr, 0, arr.Length);}return strXml;}catch{return "";}}}
}

  

这其中的ToXML为了测试方便,故意分成了二个版本(一个不用using,一个用using)

2.再创建一个Console程序(命名为WithUsing),写一段测试代码:

using System;
using System.Diagnostics;
using Model;namespace WithUsing
{class Program{static void Main(string[] args){Console.WriteLine("开始折腾-WithUsing...");Stopwatch watch = new Stopwatch();int max = 100000;watch.Reset();watch.Start();for (int i = 0; i < max; i++){SampleClass c = new SampleClass() { Name = i.ToString().PadLeft(1024, '0') };c.ToXMLWithUsing();}watch.Stop();Console.WriteLine("完成,{0}次操作共耗时:{1}毫秒,平均{2}毫秒/次!", max, watch.ElapsedMilliseconds, watch.ElapsedMilliseconds /(decimal)max);Console.ReadKey();}}
}

  

3.再创建一个Console程序(命名为NoUsing),写一段测试代码:

using System;
using System.Diagnostics;
using Model;namespace NoUsing
{class Program{static void Main(string[] args){Console.WriteLine("开始折腾-NoUsing...");Stopwatch watch = new Stopwatch();int max = 100000;watch.Reset();watch.Start();for (int i = 0; i < max; i++){SampleClass c = new SampleClass() { Name = i.ToString().PadLeft(1024, '0') };c.ToXMLNoUsing();}watch.Stop();Console.WriteLine("完成,{0}次操作共耗时:{1}毫秒,平均{2}毫秒/次!", max, watch.ElapsedMilliseconds, watch.ElapsedMilliseconds / (decimal)max);Console.ReadKey();}}
}

  

编译后,同时运行这二个程序,同时利用任务管理器观察内存使用情况:

反复多次运行比较,发现其实二者占用的内存几乎完全相同,这说明GC还是很给力的!

而且从执行时间上看,不用Using,反而更快,这也容易理解:用Using相当于每次都要调用Dispose()方法,这会带来一些系统开销;而不用Using,GC会在适当的时机批量回收资源,性能反而更好。(当然:这个结论不是要误导大家不用using,对于using还是推荐使用的!我的用意在于大家对于一些具体问题要具体分析,不可纯教条主义,一味迷信某些主流的观点)

c#:使用using关键字自动释放资源未必一定就会有明显好处相关推荐

  1. Notepad++ JSON关键字自动提示

    Notepad++关键字自动提示 2017-08-31 目录 1 插件安装 2 往JSON中加关键字 3 智能提示 最近接口测试自动化框架的的case是json格式,用例的json的格式是固定的,定义 ...

  2. elasticsearch搜素关键字自动补全(suggest)

    elasticsearch搜素关键字自动补全顾名思义 在搜索框搜索时能有提示列表可供选择. 最终效果如下: 该搜索优化功能是elasticsearch自带的即suggest,suggest即存储一个词 ...

  3. pthread 线程退出时自动释放资源

    线程退出时自动释放资源 今天碰到一个问题:主线程pthread_create一个子线程A,子线程pthread_mutex_lock,然后调用其他的函数fun,最后从fun返回后再pthread_mu ...

  4. python打开网址搜索关键字_Python实验:百度搜索关键字自动打开相关URL

    #! python # coding: utf-8 # python实现百度搜索关键字,并依次用浏览器打开前五个搜索结果 ## ##Beautiful Soup 是一个模块,用于从HTML 页面中提取 ...

  5. Excel VBA高级编程 - 根据关键字自动搜索,自动生成下拉菜单

    关注微信公众号:万能的Excel,回复关键词[下拉菜单]获取Excel源文件 功能说明: 因为工作需要,每一次都要从SAP查找物料信息,手动生成物料清单(Boom表),繁琐且容易出错. 使用VBA实现 ...

  6. dedecms实现关键字自动加内链

    方法一:核心->文档关键词维护->增加一个关键字和链接重新生成文章即可 方法二: 织梦dedecms文章内容页如何实现自动增加关键字内链 dede的文档关键词维护,就是自动加内链锚文本,对 ...

  7. 微信小程序input输入框关键字自动联想及关键字高亮

    找了好多博客都没有找到关于小程序,模糊查询,自动联想,和关键字高亮显示的文章,没办法,自己造吧. 本文采用的是动态联想,即在input框中输入关键字后,将关键字作为条件去数据库查询,然后将所有查询结果 ...

  8. python百度关键词自动提交订单_Python小工具-根据输入关键字自动打开百度搜索结果的第一页...

    PythonBaidu.gif 步骤分析: 1. 伪装浏览器的 User-Agent 2. 读取输入参数并组装为请求参数 3. 使用 `requests` 模块请求数据 4. 使用 `bs4` 查找需 ...

  9. Slack设置根据关键字自动提醒的小技巧

    在Slack的preference里, 可以设置当别人发送包含有指定内容关键字的文本信息时,自动高亮提示,关键字大小写不敏感. 一个例子: 要获取更多Jerry的原创文章,请关注公众号"汪子 ...

最新文章

  1. Mysql 练习 总结
  2. javascript 编程思想
  3. linux如何判断光盘是否挂载,LInux下如何挂载光盘找rpm包的方法步骤
  4. XCTF_Web_新手练习区:weak_auth
  5. python文件管理包_Python标准库04 文件管理 (部分os包,shutil包)
  6. vscode 英伟达tk1_英伟达的未来,不只是GPU
  7. Together(AtCoder-3524)
  8. hsqldb和mysql_HSQLDB的研究与性能测试(与Mysql对比)
  9. Python sysos模块
  10. PowerDesigner生成数据库表
  11. SparkStreaming简介
  12. 【算法】常见排序算法效率比较和代码
  13. STM32+IR2104S的H桥电机驱动电路详解
  14. 电路中各种地,数字地DGND、模拟地AGND、功率地PGND、电源地GND、交流地AGND、大地EGND的区别及处理
  15. 考研复试C程序设计基础
  16. Linux Thermal机制源码分析之Thermal zone
  17. Google 3D压缩项目Draco简析
  18. C++算法之-小球问题
  19. 使用 TestFlight 进行 iOS App 内测
  20. 解决:Activiti7与SpringBoot整合时,默认生成的activiti数据库中只有17张表,无另外8张历史表

热门文章

  1. cookie、localStorage和sessionStorage区别
  2. Jenkins与SVN持续集成
  3. 拖慢操作系统启动的8个真实原因
  4. Windows系统“无法打开”故障解决方法之一
  5. 一个合格程序员该做的事情
  6. Asp.net网站的自动部署-sqlserver数据库的自动部署
  7. C#未来新特性:静态委托和函数指针
  8. 前端:JS中JSON对象和String转换
  9. protocol buff
  10. 删除排序链表中的重复元素