Effect C# 条款16 尽量减少内存垃圾的心得

来源:互联网 发布:淘宝宝贝图片分辨率 编辑:程序博客网 时间:2024/05/21 10:06

 

今天写了一个方法,原始不是这样的,下面是一个转换的写法,为了能看的更清楚

StringBuilder str = new StringBuilder("......"); //此处......代表10000个长的一个字符串,这里是做个比方,是因为前面生成的str有这个长度

byte[] byteOut = new byte[str.count];

for(int i = 0;i<65535;i++)

{

      byteOut[i] = Convert.ToByte(str.ToString().Substring(i,1),2);

}

当运行之后,发现这个程序的运行时间比较长。

然后想起了effect c#中的第16条,同样也是在一个循环中重复的创建一样的对象的浪费。一个看似没有问题,写起来比较顺手的程序,其实其中每一次的str.ToString()都在重复构建对象,虽然根据数据库连接池来说这构建的对象仅仅放在池中的一个位置,但是在每次循环中都会运行一次这么大字符串的操作会耗费非常多的时间。条款16中也指出,对于这样的问题应该将对象上提,在书中写的是将局部变量提为全局变量来解决。在这里修改为以下的情况就能够解决了

StringBuilder str = new StringBuilder("......"); //此处......代表10000个长的一个字符串,这里是做个比方,是因为前面生成的str有这个长度

byte[] byteOut = new byte[str.count];

string initStr = str.ToString();

for(int i = 0;i<65535;i++)

{

      byteOut[i] = Convert.ToByte(initStr.Substring(i,1),2);

}

将局部变量上提,只进行一次操作。在循环中尽量减少程序的执行步骤,这也是上一篇中出现的问题的解决办法。

看似一个很简单的问题,但是在2天内已经出现2次了。在写程序中,疏忽大意出现这种问题确实很平常,这里是因为图像的操作都是一些比较大的循环,所以除了效率问题很容易发现,如果在较小的循环中实际上根本发现不了,但当数据量多的时候就会显现出来了。这也是一个代码效率的问题,在以后的循环中一定要注意这些。