代码改变世界

.net开发性能优化总结,持续中...

2013-08-11 02:26  -夜  阅读(222)  评论(0编辑  收藏  举报

字符串操作相关

  1.  连接字符串使用StringBuilder类的,Append(),AppendForm()等方法:如
                StringBuilder sb = new StringBuilder(); sb.AppendLine("/// <summary>");
                sb.AppendLine("\t\t/// 根据主键删除一条数据");
                sb.AppendLine("\t\t/// </summary>");
                sb.AppendFormat("\t\t/// <param name=\"{0}\"></param>\r\n", ToCamel(GetPKName()));
                sb.Append("\t\t/// <returns></returns>");

  2. 建议使用s+=i,不建议使用s=s+i
  3. 字符串比较。高效的做法是使用  Compare  方法,这个方法可以做大小写忽略的比较,并且不会创建新字符串。如
                string userCode = txtVCode.Text.Trim();
                if (Session["VCode"] != null)
                {
                    string sysCode = Session["VCode"].ToString();
                    if (String.Compare(userCode, sysCode, true) == 0)
                    {
                        return true;
                    }
                    else
                    {
                        JScript.Alert(this, "验证码输入错误");
                    }
                }
                else
                {
                    JScript.Alert(this, "验证码过期");
                }
                return false;

  4. 避免不必要的调用 ToUpper  或 ToLower  方法 ;String 是不变类,调用ToUpper 或ToLower 方法都会导致创建一个新的字符串;如果被频繁调用,将导致频繁创建字符串对象

异常处理

  1. 关于异常处理的最重要原则就是:不要吃掉异常。这个问题与性能无关,但对于编写健壮和易于排错的程序非常重要。这个原则换一种说法,就是不要捕获那些你不能处理的异常(能不用tyr{}catch{}则不用,能预测和处理的异样早作处理)。 吃掉异常是极不好的习惯,因为你消除了解决问题的线索。一旦出现错误,定位问题将非常困难。除了这种完全吃掉异常的方式外,只将异常信息写入日志文件但并不做更多处理的做法也同样不妥。
  2. 避免不必要的重新抛出异常   如果是为了包装异常的目的(即加入更多信息后包装成新异常),那么是合理的。但是有不少代码,捕获异常没有做任何处理就再次抛出,这将无谓地增加一次捕获异常和抛出异常的消耗,对性能有伤害。
  3. 捕获指定的异常,不要使用通用的System.Exception,如
                //避免 
                try
                {
                }
                catch (Exception ex)
                {
                }
                // 推荐 
                try
                {
                }
                catch (NullReferenceException ex)
                {
                }
                catch (ArgumentOutOfRangeException ex)
                {
                }
                catch (InvalidCastException ex)
                {
                }

Javascript方面相关

  1. 尽量将页面内的Jscript脚本移入到单独的JS文件中;将页面内的Jscript脚本放置在Page的最下面,有助于提高页面的响应速度。

数据库操作方面相关

  1. 能用ExecuteScare的实现的数据库操作就不要用其它的Execute
  2. 如果需要一次导入或者导出大量数据,建议用DataReader,并且使用前打开数据库连接。

其它暂时未分类

  1. 使用Server.Transfer()重定向请求优于Response.Redirect()。需要注意使用Server.Tranfer(),第一:地址栏的url不会变,但是打开的是另外一个页面;第二,它会跳过安全检查;第三,只适用于在同一Web应用内的页面间跳转,如果用户点击后退或者刷新可 能会发生意外情况。
  2. 避免循环创建对象;如果对象并不会随每次循环而改变状态,那么在循环中反复创建对象将带来性能损耗。高效的做法是将对象提到循环外面创建; 如果对象只在某些逻辑分支中才被用到,那么应只在该逻辑分支中创建对象:如
                IList<BooksInfo> list;
                if (dt.Rows.Count > 0)
                {
                    list = new List<BooksInfo>();
                    for (int i = 0; i < dt.Rows.Count; i++)
                    {
                    }
                }

  3. 避免在循环体里声明变量, 应该在循环体外声明变量,在循环体里初始化,如
                // 避免 
                for (int i = 0; i < 10; i++)
                {
                    BooksInfo model = new BooksInfo();
                }
                // 推荐 
                BooksInfo model = null;
                for (int i = 0; i < 10; i++)
                {
                    model = new BooksInfo();
                }

  4. CLR 保证所有对象在访问前已初始化,其做法是将分配的内存清零。因此,不需要将变量重新初始化为0、false 或null 。需要注意的是:方法中的局部变量不是从堆而是从栈上分配,所以C#不会做清零工作。如果使用了未赋值的局部变量,编译期间即会报警。不要因为有这个印象而对所有类的成员变量也做赋值动作,两者的机理完全不同!
  5. 避免使用ArrayList。 因为任何对象添加到ArrayList 都要封箱为System.Object 类型,从ArrayList取出数据时,要拆箱回实际的类型。建议使用自定义的集合类型代替ArrayList。.net 2.0 提供了一个新的类型,叫泛型,这是一个强类型,使用泛型集合就可以避免了封箱和拆箱的发生,提高了性能。
  6. 预先计算collection 的length 。 如:
                //将
                for (int i = 0; i < collection.length; i++) { }
                //替换成:
                for (int i = 0, len = collection.length; i < len; i++) { }
                //效果会更好,尤其是在大循环中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

作者:夜 本文地址:http://www.cnblogs.com/ful1021 本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明。如有问题,可以邮件:531761819@qq.com 联系我,非常感谢。