HTML5技术

第一次通过CLR Profile解决内存占用过高的问题 - JustYong

字号+ 作者:H5之家 来源:H5之家 2016-01-15 16:09 我要评论( )

炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样。" 勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况。" 炮哥:哎哟,不错啊,玩高级的了。 勇哥:也没有啊,就是发现点击查询按钮查询数据时,如果数据量一大的话,内存上上升了好几个M,所以第一感觉就

炮哥:"嘿,哥们,忙啥呢,电脑卡成这逼样。"

勇哥:"在用CLR Profile工具分析下FlexiPrint的内存占用情况。"

炮哥:“哎哟,不错啊,玩高级的了。”

勇哥:“也没有啊,就是发现点击查询按钮查询数据时,如果数据量一大的话,内存上上升了好几个M,所以第一感觉就不太正常。正好以前也了解过CLR Profile,但一直没怎么具休的用过,这次正好拿来研究研究。”

炮哥:“Nice job,要向你学习,能够主动发现问题并研究解决方法。对了,有什么发现么?”

勇哥:“通过工具发现dgMain_CellFormatting方法占用内存过多。”

炮哥:“这个方法干嘛用的,要这么多的内存?”

勇哥:“其实做的事情很简单,根据每行订单的不同状态,显示不同的图标,以便让客户能够很直白的了解订单的状态。”

炮哥:“噢,是这样,那确实没什么,让我看下代码。”

namespace IPP_PCL.HomeViewUserControl { PrintOrderInformationUserControl : UserControl, IHomePrintOrderInformationView { #region Field private readonly PrintCellLiteServiceClient _serviceClient = new PrintCellLiteServiceClient(); #endregion #region Event Handler 此事件主要用于图片按钮的显示 dgMain_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) { )) { int row = e.RowIndex; status = dgMain.Rows[row].Cells[].Value.ToString(); switch (status) { : ].Value.ToString(); //从DB中查找erp_so_number的记录 IEnumerable<FileIndexModel> fileIndexes = _serviceClient.GetFileIndex(erpSoNumber); (fileIndexes == null || !fileIndexes.Any()) { break; } FileIndexModel fileIndex = fileIndexes.First(); if (FileStatus.PRINTED != fileIndex.PrintedStatus && FileStatus.PARTIAL_PRINTED != fileIndex.PrintedStatus) { e.Value = Properties.Resources.picYellow; } else { e.Value = Properties.Resources.picGreen; } break; : e.Value = Properties.Resources.picGreen; break; : e.Value = Properties.Resources.picGreen; break; default: e.Value = Properties.Resources.picYellow; break; } } } #endregion } }

勇哥:“......”

炮哥:“很简单,写得很明白,这方法没什么问题吧,会不会搞错了。”

勇哥:“应该不会,通过CLR Profile分析发现,在这个方法中创建了非常多的对象。”

炮哥:“你是说BitMap对象?”

勇哥:“是的。”

炮哥:“噢,明白了,每次访问Properties.Resources.picGreen类似的属性时,都会创建一个新的对象。但其实图标就那么几类,完全可以先保存在内存中,要用时直接引用就行了。”

勇哥:“说得对,让我修改下代码 ,看看情况。”

炮哥:“让我看下你怎么修改的?”

勇哥:“......”

1 namespace IPP_PCL.HomeViewUserControl 2 { PrintOrderInformationUserControl : UserControl, IHomePrintOrderInformationView 4 { 5 #region Field PrintCellLiteServiceClient _serviceClient = new PrintCellLiteServiceClient(); 8 9 Bitmap picGreenBitMap = Properties.Resources.picGreen; 10 11 Bitmap picYellowBitMap = Properties.Resources.picYellow; Ctor PrintOrderInformationUserControl() 18 { 19 InitializeComponent(); 20 } Event Handler 此事件主要用于图片按钮的显示 dgMain_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 32 { )) 34 { 35 int row = e.RowIndex; status = dgMain.Rows[row].Cells[].Value.ToString(); (status) 40 { : proDt = dgMain.DataSource as DataTable; (proDt == null || proDt.Rows.Count == 0) { break; } erpSoNumber = ].Value.ToString(); IEnumerable<FileIndexModel> fileIndexes = _serviceClient.GetFileIndex(erpSoNumber); (fileIndexes == null || !fileIndexes.Any()) { break; } 54 55 FileIndexModel fileIndex = fileIndexes.First(); (FileStatus.PRINTED != fileIndex.PrintedStatus && FileStatus.PARTIAL_PRINTED != fileIndex.PrintedStatus) 58 { 59 e.Value = picYellowBitMap; 60 } { 63 e.Value = picGreenBitMap; 64 } ; : 69 70 e.Value = picGreenBitMap; 71 break; : 74 75 e.Value = picGreenBitMap; 76 break; : 79 80 e.Value = picYellowBitMap; 81 break; 82 } 83 } 84 } } 89 }

炮哥:“再用CLR Profile分析下修改后的内存情况。”

勇哥:“你看,内存直接从9.0M变为425kB。”

炮哥:“哈哈,看来问题已经解决了。”

勇哥:“今天我发现C#也有闭包的概念。”

炮哥:“闭包?什么玩意?”

勇哥:“我是在学习JS的时候发现有闭包这个概念,但是没想到C#也有这个。”

炮哥:“所以说当你视野放开时,你会发现更多的美好。”

勇哥:“不扯了,该下班了。噢,对了,昨晚看了一部电影<美丽人生>,有兴趣的话可以看下,很不错。”

 

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • ABP入门系列(16)——通过webapi与系统进行交互 - 『圣杰』

    ABP入门系列(16)——通过webapi与系统进行交互 - 『圣杰』

    2017-04-25 09:04

  • 第一次创业回忆录:从博客走向微博那荡起与陨落的三年(2011-2013) - 路过秋天

    第一次创业回忆录:从博客走向微博那荡起与陨落的三年(2011-2013)

    2017-02-17 14:01

  • 记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗与新榜等第三方平台) - 彩色铅笔

    记一次企业级爬虫系统升级改造(四):爬取微信公众号文章(通过搜狗

    2017-01-12 10:01

  • form表单提交和ajax表单提交,关于移动端如何通过软键盘上的【搜索】和【前进】进行提交操作 - 怪诞咖啡

    form表单提交和ajax表单提交,关于移动端如何通过软键盘上的【搜索】

    2016-12-10 11:00

网友点评
=