其实VS已经提供基于CPU占用情况的性能分析功能,但它并不能什么情况都能分析出来。当你发现mscorwks.dll这玩意占用着大量的资源,确无法点击进去的看具体情况的时候有可能会感到无能为力,也许已经尽力了那些.net framework的事情管不了。其实mscorwks.dll的损耗和我们编写的代码有着紧密的联系,我们可以通过VS的内在分析工作看下代码的内存分配状况然后再查找问题。
打开性能分析向导
选择内存分配采样即可。
运行后会产以下的结果图:
图中可以看到占用字节最多的方法和分配最多字节的类型,我们可以点击内存分配最多的类型看下详细列表
在这里我们可以看到byte[]和char[]分配了大量的内存,而这些通过cpu性能分析是看不到的,而这些对像的创建和销毁都会使用的资源的。我们可以点击一下看这些内存分配是那里产生的。
从上面的图可以看到byte[]的分配主要是来源于池的初始化,既然是必须的就不用考虑那是必须做的。再来看下char[]来源于每次写入的Encoding.Getbytes里的string.ToCharArray();反编译看下代码情况:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
// System.Text.Encoding public 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); } // string public 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://www.cnblogs.com/smark/archive/2012/03/14/2395620.html
03 2012 档案
Silverlight使用socket tcp简单实现聊天室功能
posted @ 2012-03-29 09:54 smark 阅读(828) | 评论 (0) 编辑
Silverlight socket组件
posted @ 2012-03-26 09:53 smark 阅读(1223) | 评论 (2) 编辑
Socket Tcp服务吞吐测试工具
posted @ 2012-03-26 08:51 smark 阅读(101) | 评论 (0) 编辑
实现高性能稳定的socket tcp通讯经验分享
posted @ 2012-03-23 10:06 smark 阅读(2422) | 评论 (23) 编辑
beetle进行同屏500物体广播测试
posted @ 2012-03-21 15:40 smark 阅读(94) | 评论 (0) 编辑
beetle进行1KW次连接接入和断开检测稳定测试
posted @ 2012-03-20 14:16 smark 阅读(81) | 评论 (0) 编辑
Beetle进行10亿次请求的压力和稳定性测试
posted @ 2012-03-19 08:46 smark 阅读(130) | 评论 (0) 编辑
通过VS2010的内存分析工具来分析程序性能问题
posted @ 2012-03-14 11:34 smark 阅读(1578) | 评论 (1) 编辑
int 转byte[]的相关方法和应用场景
posted @ 2012-03-12 11:45 smark 阅读(1583) | 评论 (3) 编辑
c#使用foreach需要知道的
posted @ 2012-03-10 16:03 smark 阅读(1350) | 评论 (4) 编辑
beetle1.1性能测试报告
posted @ 2012-03-09 10:58 smark 阅读(85) | 评论 (0) 编辑
基于C#实现的开源自动更新程序
posted @ 2012-03-04 18:13 smark 阅读(279) | 评论 (0) 编辑