zoukankan      html  css  js  c++  java
  • smark 通过VS2010的内存分析工具来分析程序性能问题

    其实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简单实现聊天室功能
    摘要: Silverlight虽然提供了socket功能,但仅仅数据接收和发送的基础功能,你必须还要息制定协议和处理烦脑的粘包问题才能更好地进行信息处理.这里介绍如何通过Beetle.SL这个基于Silverlight socket实现的开源组件如何方便地解决这些问题.下面通过组件在Silverlight下实现一个聊天室程序.聊天室的功能主要是登陆,获取当前其他用户和信息转发. 首先Beetle.SL是支持通过对象来描述tcp通讯协议,只需简单地实现IMessage接收就可以了.以下是制定信息 public class Register:MsgBase { public ...阅读全文

    posted @ 2012-03-29 09:54 smark 阅读(828) | 评论 (0) 编辑

    Silverlight socket组件
    摘要: 在Silverlight 一般是采用wcf进行数据通讯,毕竟wcf在数据结构定义上非常方便,但如果你想用Silverlight下的socket进行对象传偷就不得不封装处理一下,在Silverlight下有XML序列化也是非常方便的,但这样会导致消息比较臃肿,同样还要对数据包分析处理包括粘包等工作.如果你要面对这些问题那以下组件也许会给你带来很大的帮助.Beetle.SL是封装Silverlight socket tcp的一个开源组件. 组件封装方便使用的TcpChannel,通过事件定义就能方便进行tcp连接,数据接收事件定义等.更重要的是组件提供灵活的协议分析器,可以根据分析器直接实现...阅读全文

    posted @ 2012-03-26 09:53 smark 阅读(1223) | 评论 (2) 编辑

    Socket Tcp服务吞吐测试工具
    摘要: 如果你在写一个Socket Tcp服务,想知道当前的写的服务在数据发送和接收上是不是有着好的性能,不防可以用这个工具测试一下这个工具会向服务端建立1000个连接,根据你设置的间隔和包大小向服务发送信息,服务只需把数据回发即可,延时只是一个参考,因为程序本身是异步和队列处理也会受cpu影响导致一些网络以外的延时情况TcpSocketPerformanceTest.rar (78.33 kb)阅读全文

    posted @ 2012-03-26 08:51 smark 阅读(101) | 评论 (0) 编辑

    实现高性能稳定的socket tcp通讯经验分享
    摘要: 其实在.net socket编写高性能稳定方面的资料真的比较少,一个实质性的测试数据结果对比就更少了.我们可以从http://msdn.microsoft.com/zh-cn/magazine/cc163356.aspx看到MS说net 2.0 sp1后的socket通讯能力非常强劲,可以同时挂起6W个IO(可以简单地认为可以在一秒内send+receive可以达到6W或更高),但要找这个数据的测试似乎很难.但在一篇MS关于WCF的性能测试中基于tcp部署的性能在一台4路服务器中可以达到这个量(http://msdn.microsoft.com/en-us/library/bb310550..阅读全文

    posted @ 2012-03-23 10:06 smark 阅读(2422) | 评论 (23) 编辑

    beetle进行同屏500物体广播测试
    摘要: 信息广播是一种很常见的信息通讯情况,如是IM的群组或游戏的同场景玩家,相对IM来说游戏这种场景广播所产生的信息量就非常大,因为一个玩家的行为改变都要通道同场景的所有玩家.如果一个500玩家的场景,每个玩每秒都在运动那将会产生500X500=250000的信息量.如果每个员家每秒都产生2次变化那就将会是50W的消息量.经过测试beetle在一台core e4300 1.8g的pc完全能够处理500X500X2的消息量.以下是一个测试结果.client的延时和消息情况服务端的处理情况阅读全文

    posted @ 2012-03-21 15:40 smark 阅读(94) | 评论 (0) 编辑

    beetle进行1KW次连接接入和断开检测稳定测试
    摘要: 一个通讯组件除了面对固有连接的压力测试外还必须针对新的连接接入和断开释放处理,beetle进行了1KW次连接接入断开后能够很好的释放占用内存,从测试结果来看没有出现内存的增长。 测试是两台client分别每秒以600-1000的数量接入到beetle服务端,请求应答10次后自动断开连接。beetle对30秒内就没有进请求的连接进行强行关闭并释放资源。以下是测试情况:阅读全文

    posted @ 2012-03-20 14:16 smark 阅读(81) | 评论 (0) 编辑

    Beetle进行10亿次请求的压力和稳定性测试
    摘要: 作为一个通讯基础组件,其稳定性必须进行大量的测试。因为服务必须保持不7x24不间断地运行,任何的内存的持续性增长都会导致服务最终因为内存问题而倒下。Beetle为了保证这一点在1.2的版本进行了各项优化,经初步测试进行大量并发的同时进行长时间压力测试,经过十几亿次的请求应答后Beetle依然保持着稳定的内存使用状况。 以下是测试描述和结果。 服务端: CORE E4300 1.8G win2003 两台client建立4K个长连接,每个连接大概每0.1秒向服务器发送请求,请求对象是class Register : IMessage { public...阅读全文

    posted @ 2012-03-19 08:46 smark 阅读(130) | 评论 (0) 编辑

    通过VS2010的内存分析工具来分析程序性能问题
    摘要: 其实VS已经提供基于CPU占用情况的性能分析功能,但它并不能什么情况都能分析出来。当你发现mscorwks.dll这玩意占用着大量的资源,确无法点击进去的看具体情况的时候有可能会感到无能为力,也许已经尽力了那些.net framework的事情管不了。其实mscorwks.dll的损耗和我们编写的代码有着紧密的联系,我们可以通过VS的内在分析工作看下代码的内存分配状况然后再查找问题。 打开性能分析向导选择内存分配采样即可。运行后会产以下的结果图:图中可以看到占用字节最多的方法和分配最多字节的类型,我们可以点击内存分配最多的类型看下详细列表在这里我们可以看到byte[]和char[]分配了...阅读全文

    posted @ 2012-03-14 11:34 smark 阅读(1578) | 评论 (1) 编辑

    int 转byte[]的相关方法和应用场景
    摘要: 在c#中把int转成byte[]一般都会使用BitConverter.GetBytes可以获取得到,但BitConverter有个问题就是每次调用都会产生一个新byte[];如果你比较执着的话以下提供两种方式可以省下这一些。 从BitConverter中把代码偷取出来,加功一下:),先看下BitConverter.GetBytes关于int的方法1 public unsafe static byte[] GetBytes(int value)2 {3 byte[] array = new byte[4];4 fixed (byte* ptr = array)5 {...阅读全文

    posted @ 2012-03-12 11:45 smark 阅读(1583) | 评论 (3) 编辑

    c#使用foreach需要知道的
    摘要: 在c#中通过foreach遍历一个列表是经常拿用的方法,使用起来也方便,性能上也和for没有多大的差别;那为什么还要注意呢?我们先下来看下以下这句话:分配的内存数量和完成测试所需的时间之间有直接关系。当我们单独查看的时候,内存分配并不是非常昂贵。但是,当内存系统只是偶尔清理不使用的内存时,问题就出现了,并且问题出现的频率和要分配的内存数量成正比。因此,你分配越多的内存,对内存进行垃圾回收的频率就越频繁,你的代码性能就会变得越差。 从上面那些话可以看到内存的回收是非常损耗资源,那我们再看下一些.net内部类型的实现。Array:// System.Arraypublic IEnumerat...阅读全文

    posted @ 2012-03-10 16:03 smark 阅读(1350) | 评论 (4) 编辑

    beetle1.1性能测试报告
    摘要: 这是针对beetle1.1进行的性能测试结果,其性能会比1.0有接近15%的提高,分别针对单一对象请求应答和列表对象请求应答来进行一个性能对比。单一对象结构: class User : IMessage { public string Name; public string EMail; public string City; public string Counrty; public void Save(BufferWriter writer) ...阅读全文

    posted @ 2012-03-09 10:58 smark 阅读(85) | 评论 (0) 编辑

    基于C#实现的开源自动更新程序
    摘要: Ant是基于C#编写的自动更新程序,其主要目的是简单方便地对.net桌面应用程序进行自动更新,解决版本更新的烦恼。Ant主要分为三个部分:服务端,管理端和程序端。 服务端主要用于提供文件更新和下载用 管理端是用于把最新版本的程序更新到服务端 程序端,主要是获取服务端的文件信息把最新的文件更新到本地程序端使用前需要引用Ant.Component,在程序开始处使用检测代码private void Form1_Load(object sender, EventArgs e) { string host = "www.henryfan.net"; ...阅读全文

    posted @ 2012-03-04 18:13 smark 阅读(279) | 评论 (0) 编辑

  • 相关阅读:
    Java代码生成器多表配置优化,增加自定义实体功能
    Java代码生成器加入postgresql数据库、HikariCP连接池、swagger2支持!
    SSM/SpringBoot代码生成器全面升级—增加全新前后端分离响应式主题,修复若干Bug
    记一次真实的线上事故:一个update引发的惨案!
    昨日学习安排
    C++个人学习笔记
    C++位运算符
    随手写事two
    随手写事
    Tomcat一对多遇到得问题
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2441020.html
Copyright © 2011-2022 走看看