浅尝EffectiveCSharp_9

减少GC负担的编程技巧
本文介绍了几种提高程序效率的方法,包括避免重复创建相同的对象,如字体和画刷;使用静态属性来保持对象引用;以及利用StringBuilder替代String进行字符串拼接,减少垃圾回收的压力。

Item 16: Avoid Creating Unnecessary Objects 避免创建不必要的对象

  • GC内存管理上做的很好,而且它会高效的移除没用的对象。但是不要让他工作过度,你可以通过一些简单的方法来最小化GC的工作量。下面来看例子
    // Sample one
    protected override void OnPaint(PaintEventArgs e)
    {
    // Bad. Created the same font every paint event.
    using (Font MyFont = new Font("Arial", 10.0f))
    {
    e.Graphics.DrawString(DateTime.Now.ToString(),
    MyFont, Brushes.Black,
    new PointF(0, 0));
    }
    base.OnPaint(e);
    }

     

     在这里OnPaint()方法经常被调用。每当他被调用的时候,就会产生另一个一摸一样的Font对象。GC每次都要为你清除,这是低效的。取而代之的是,把Font对象从一个局部变量提升为一个成员变量。
    private readonly Font myFont =new Font("Arial", 10.0f);
    protected override void OnPaint(PaintEventArgs e)
    {
    e.Graphics.DrawString(DateTime.Now.ToString(),
    myFont, Brushes.Black,
    new PointF(0, 0));
    base.OnPaint(e);
    }

     

  • 下面我们来看上面例子中的静态属性Brushes.Black。假如每次你在你的window上画画都用黑色,那么就要黑色的刷子。而你每次为了画画都创建一个新的刷子,然后再销毁,而且我们可能还会用到很多其他的工具,这样会显得低效。因此我们需要做这样的一个简单实现
    private static Brush blackBrush;
    public static Brush Black
    {
    get
    {
    if (blackBrush == null)
    blackBrush
    = new SolidBrush(Color.Black);
    return blackBrush;
    }
    }

     当你第一次请求一个黑色刷子时,Brushes类会创建它,而且保留了一个对唯一黑色刷子的引用,当你再次用到它的时候,它就会返回原来的刷子。也就是说,创建一个刷子,永远使用。

  • 第三个技巧包含:为不可变的类型创建终值。System.String就是不可变的:当你创建了一个string类型,string的内容是不可修改的。

    string msg = "Hello, ";
    msg
    += thisUser.Name;
    msg
    += ". Today is ";
    msg
    += System.DateTime.Now.ToString();
    is just as inefficient as if you had written this:
    string msg = "Hello, ";
    // Not legal, for illustration only:
    string tmp1 = new String(msg + thisUser.Name);
    msg
    = tmp1; // "Hello " is garbage.
    string tmp2 = new String(msg + ". Today is ");
    msg
    = tmp2; // "Hello <user>" is garbage.
    string tmp3 = new String(msg + DateTime.Now.ToString());
    msg
    = tmp3; // "Hello <user>. Today is " is garbage.

     

     字符串tmp1, tmp2, and tmp3 还有创建的msg("Hello")都成为了垃圾。对String使用+=方法就是创建一个string对象然后返回它。它并没有修改原有的string。
    因此这里我们使用StringBuilder类
    StringBuilder msg = new StringBuilder("Hello, ");
    msg.Append(thisUser.Name);
    msg.Append(
    ". Today is ");
    msg.Append(DateTime.Now.ToString());
    string finalMsg = msg.ToString();

     

     StringBuilder是一个可变的字符串类,对于易变的字符串,使用StringBuilder更加高效。

转载于:https://www.cnblogs.com/TivonStone/archive/2010/06/12/1756284.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值