• 通过VS2010的内存分析工具来分析程序性能问题


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

      打开性能分析向导

    选择内存分配采样即可。

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

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

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

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

    // 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提供的性能分析,它真的可以帮你分析到很多你想要的东西。

    访问Beetlex的Github
  • 相关阅读:
    做程序员,我骄傲了吗?
    乐字节Java面向对象三大特性以及Java多态
    Java为什么有前途?什么人适合学Java?
    Java新手从入门到精通的学习建议
    Java变量与数据类型之二:Java常量与变量
    模块化、结构化的代码,程序员正讲述着人生
    乐字节Java变量与数据类型之一:Java编程规范,关键字与标识符
    乐字节Java学习课程-path环境变量的作用与配置
    我英语不好,能学会编程吗?
    为什么欧拉图要用栈存然后逆着输出
  • 原文地址:https://www.cnblogs.com/smark/p/2395620.html
Copyright © 2020-2023  润新知