WEB开发网
开发学院WEB开发ASP.NET ASP.NET性能优化 阅读

ASP.NET性能优化

 2010-10-31 08:59:55 来源:WEB开发网   
核心提示: 这里有一个细节应注意:StringBuilder 内部 Buffer 的缺省值为 16 ,这个值实在太小,ASP.NET性能优化(6),按 StringBuilder 的使用场景,Buffer 肯定得重新分配,如果有多个方法都需要同步,并且有不同的目的,经验值一般用 256 作为 Buffer 的初值,当然

  这里有一个细节应注意:StringBuilder 内部 Buffer 的缺省值为 16 ,这个值实在太小。按 StringBuilder 的使用场景,Buffer 肯定得重新分配。经验值一般用 256 作为 Buffer 的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这个值来设定 Buffer 的初值。使用 new StringBuilder(256) 就将 Buffer 的初始长度设为了256。
 1.2.2 避免不必要的调用 ToUpper 或 ToLower 方法
 String是不变类,调用ToUpper或ToLower方法都会导致创建一个新的字符串。如果被频繁调用,将导致频繁创建字符串对象。这违背了前面讲到的“避免频繁创建对象”这一基本原则。
 例如,bool.Parse方法本身已经是忽略大小写的,调用时不要调用ToLower方法。
 另一个非常普遍的场景是字符串比较。高效的做法是使用 Compare 方法,这个方法可以做大小写忽略的比较,并且不会创建新字符串。
  还有一种情况是使用 HashTable 的时候,有时候无法保证传递 key 的大小写是否符合预期,往往会把 key 强制转换到大写或小写方法。实际上 HashTable 有不同的构造形式,完全支持采用忽略大小写的 key: new HashTable(StringComparer.OrdinalIgnoreCase)。
 1.2.3 最快的空串比较方法
 将String对象的Length属性与0比较是最快的方法:if (str.Length == 0)
 其次是与String.Empty常量或空串比较:if (str == String.Empty)或if (str == "")
 注:C#在编译时会将程序集中声明的所有字符串常量放到保留池中(intern pool),相同常量不会重复分配。

1.3 多线程

1.3.1 线程同步
 线程同步是编写多线程程序需要首先考虑问题。C#为同步提供了 Monitor、Mutex、AutoResetEvent 和 ManualResetEvent 对象来分别包装 Win32 的临界区、互斥对象和事件对象这几种基础的同步机制。C#还提供了一个lock语句,方便使用,编译器会自动生成适当的 Monitor.Enter 和 Monitor.Exit 调用。
 1.3.1.1 同步粒度
 同步粒度可以是整个方法,也可以是方法中某一段代码。为方法指定 MethodImplOptions.Synchronized 属性将标记对整个方法同步。例如:[MethodImpl(MethodImplOptions.Synchronized)]
public static SerialManager GetInstance()
{
if (instance == null )
{
instance = new SerialManager();
}
return instance;
}


通常情况下,应减小同步的范围,使系统获得更好的性能。简单将整个方法标记为同步不是一个好主意,除非能确定方法中的每个代码都需要受同步保护。
 1.3.1.2 同步策略
 使用 lock 进行同步,同步对象可以选择 Type、this 或为同步目的专门构造的成员变量。
 避免锁定Type★
  锁定Type对象会影响同一进程中所有AppDomain该类型的所有实例,这不仅可能导致严重的性能问题,还可能导致一些无法预期的行为。这是一个很不 好的习惯。即便对于一个只包含static方法的类型,也应额外构造一个static的成员变量,让此成员变量作为锁定对象。
 避免锁定 this
  锁定 this 会影响该实例的所有方法。假设对象 obj 有 A 和 B 两个方法,其中 A 方法使用 lock(this) 对方法中的某段代码设置同步保护。现在,因为某种原因,B 方法也开始使用 lock(this) 来设置同步保护了,并且可能为了完全不同的目的。这样,A 方法就被干扰了,其行为可能无法预知。所以,作为一种良好的习惯,建议避免使用 lock(this) 这种方式。
 使用为同步目的专门构造的成员变量
 这是推荐的做法。方式就是 new 一个 object 对象, 该对象仅仅用于同步目的。
 如果有多个方法都需要同步,并且有不同的目的,那么就可以为些分别建立几个同步成员变量。

上一页  1 2 3 4 5 6 7 8 9 10 11  下一页

Tags:ASP.NET 性能优化

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接