博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
通过VS2010的内存分析工具来分析程序性能问题
阅读量:7240 次
发布时间:2019-06-29

本文共 1266 字,大约阅读时间需要 4 分钟。

  其实VS已经提供基于CPU占用情况的性能分析功能,但它并不能什么情况都能分析出来。当你发现mscorwks.dll这玩意占用着大量的资源,确无法点击进去的看具体情况的时候有可能会感到无能为力,也许已经尽力了那些.net framework的事情管不了。其实mscorwks.dll的损耗和我们编写的代码有着紧密的联系,我们可以通过VS的内在分析工作看下代码的内存分配状况然后再查找问题。

  打开性能分析向导

选择内存分配采样即可。

运行后会产以下的结果图:

图中可以看到占用字节最多的方法和分配最多字节的类型,我们可以点击内存分配最多的类型看下详细列表

在这里我们可以看到byte[]和char[]分配了大量的内存,而这些通过cpu性能分析是看不到的,而这些对像的创建和销毁都会使用的资源的。我们可以点击一下看这些内存分配是那里产生的。

从上面的图可以看到byte[]的分配主要是来源于池的初始化,既然是必须的就不用考虑那是必须做的。再来看下char[]来源于每次写入的Encoding.Getbytes里的string.ToCharArray();反编译看下代码情况:

// System.Text.Encodingpublic virtual byte[] GetBytes(string s){	if (s == null)	{		throw new ArgumentNullException("s", Environment.GetResourceString("ArgumentNull_String"));	}	char[] array = s.ToCharArray();	return this.GetBytes(array, 0, array.Length);}// stringpublic unsafe char[] ToCharArray(){	int length = this.Length;	char[] array = new char[length];	if (length > 0)	{		fixed (char* ptr = &this.m_firstChar)		{			fixed (char* ptr2 = array)			{				string.wstrcpyPtrAligned(ptr2, ptr, length);			}		}	}	return array;}

从代码可以看到原因所在,因为GetBytes需要一个char[],而string每次获取char[]都是返回一个新提char[]对象。其实这两个对象都提供基于char[]操作和copy的到char[]的方法。仔细看下MSDN你就能找到你想要的:)这里我就不多说了。

调整一下代码后的分析结果又怎样呢?

调整一下char[]的分配一下子就少了:)创建的对象少了,分配的内存少了,那内存回收就不用说了。

如果有朋友苦于找不到程序的性能问题,不防可以试下VS提供的性能分析,它真的可以帮你分析到很多你想要的东西。

转载地址:http://zkfbm.baihongyu.com/

你可能感兴趣的文章
Entity Framework 使用注意:Where查询条件中用到的关联实体不需要Include
查看>>
mysql因为服务器异常关机倒是启动不了 找不到mysql.sock
查看>>
矩阵的坐标变换(转)
查看>>
清除浮动(带来的影响) clear与margin重叠
查看>>
C语言移位
查看>>
深度了解git工具
查看>>
Integer cache -127 - 128
查看>>
如何拷贝一个wchar_t类型的字符串
查看>>
设计模式(观察者模式)
查看>>
对Promise中的resolve,reject,catch的理解
查看>>
NFS挂载异常 mount.nfs: Input/output error
查看>>
爬虫 Day03
查看>>
内存池的原理及实现
查看>>
phpqrcode生成动态二维码简单实例
查看>>
python-函数
查看>>
iOS的Mantle实战
查看>>
自动换行
查看>>
用例分析技术阅读笔记二
查看>>
Scrapy反爬
查看>>
(十三) 整合spring cloud云架构 - SSO单点登录之OAuth2.0 根据token获取用户信息(4)
查看>>