• 大型网站的性能优化与安全(高效C#编码优化)


    1. Foreach 比 For 性能高30%
    2. 避免是使用ArrayList, 因为任何对象到ArrayList都有封装为Object,出来还要拆箱。
       用泛型去掉
    3. HashTalbe取代 StringDirectionary, NameValueCollection, HyBridCollection
    4. 为字符串容器,声明为常量
       const String c = "Active";
       MyObject obj = new MyObject();
       obj.Status = c;
    5. if(String.Compare(str1,str2,true) == 0){} // 比用UpperCase,Lowsercase效率要高
    6. StringBuilder sbXml = new StringBuilder(); sbXml.append("abc"); asbXml.ToString();
    7.  读取XML问题 (下次再详细理解)
    8. 避免在循环里声明变量, 推荐在循环外声明,循环里初始化
    9. 不用使用System.Execption ,简单但性能会比较差
       try
       {
       }
       catch(System.NullReferenceException exc)
       {
      //对空对象异常的处理
       }
       catch(System.ArgumentOutOfRangException exc)
       {
     //超出范围的异常处理
       }
       catch(System.InvalidCastException exc)
       {
        //对异常转换的处理
       }
    10.  不用用Exception 控制程序的流程

        try
     { result = 100/num;}
     catch
     {
       result = 0;
     }
     
     if(num != 0)
     {
      result = 100 / num;
     }
     else
     {
      result = 0;
     }
     
    11. 用using 和 try/finally 做资源清理
    使用非托管的资源类型,必须实现IDisposalbe的Dispose()方法,精确的释放资源。
    .net 中释放资源的代码的责任是类型的使用者。 不是类型或系统。

    在使用有Dispose()方法的类型时,就有责任调用Dispose() 方法去释放资源。 用using 或者 try/finally 是最好的。

    如果不释放会一直待在内存中,知道析构函数在确切的时候去释放。 这样系统很可能系统资源被占得太多而放慢了速度。

    SqlConnection conn = new SqlConnection(strConn);
    conn.open();
    SqlCommand cmd = conn.CreateCommand();
    cmd.ExecuteNonQuery();
    cmd.Dispose();
    conn.Dispose();
    ------------------
    using(SqlConnection conn = new SqlConnection(strConn))
    {
     using(SqlCommand cmd = new SqlCommand(strCmm,conn))
     {
      conn.open();
      cmd.ExecuteNonQuery();
     }
    }
    ---------------------
    如上代码,一个using会自动创建一个try/finally, 这样上述就形成了try/finally嵌套了。
    如果遇到会实现多个 IDisposeable接口时,用 try/finally 更好些。
    public void ExecuteCommand(string strCon, string strCmd)
    {
     Sqlconneciotn conn = null;
     SqlCommand cmd = null;
     try
     {
      conn = new SqlConnection(strConn);
      cmd = conn.CreateCommand();
      cmd.CommandText = strCmd;
      cmd.ExecuteNonQuery();
     }
     finally
     {
      if(conn != null)
       conn.Dispose();
      if(cmd != null)
       cmd.Dispose();
     }
    }
    // 这里判断是否为Null 很重要,有时释放是隐式的, 如果再释放机会报错。
    ----------------
    并不是所有的都可以放入 using ,必须是实现IDispose接口的。
    ----------------
    有些对象同时支持Dispose和Close两个方法,SqlConnection就是其中。 可以直接 sqlConnection.Close(); 关闭资源

    Dispose会释放更多的资源,他会告诉GC这个对象不需要在习惯了。 Dispose会调用 GC.SuppressFinalize(),但Close不会。
    所以Close连接时,对象也会到析构队列中排队等待释放。 所以当你有选择时,Dispose比Close要好。

    当实现了IDisposeable接口时,请确保被正确的释放。最好放入using或try/finally 中

    12. 避免滥用反射,反射是比较浪费性能的操作。
    用反射时,CLR会做校验参数,检查权限等工作,所以速度会非常的慢。所以尽量避免使用。 如果需要用动态构造类型(晚绑定),可以用如下方式去代替
     a. 用类的继承关系。 用基类的虚方法。 运行时,生产该类型的实例,将对其的引用方都其基础类型的一个变量中,然后调用该基础类型的虚方法。
     b. 用接口去实现。 将其引用放到接口类型的变量中,然后调用接口定义的虚方法
     c. 用委托。  再理解,这方式不如 a,b效率来的快。

    13. 使用值类型的ToString方法,避免装箱操作。

  • 相关阅读:
    委托
    文件流
    关于.netFramework概述
    深拷贝与浅拷贝
    序列化与反序列化
    关于可空值类型
    正则表达式
    基于WF4.0的公文管理系统
    Mahout中相似度计算方法介绍
    Mahout源码目录说明
  • 原文地址:https://www.cnblogs.com/NoRoad/p/1876593.html
Copyright © 2020-2023  润新知