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

ASP.NET性能优化

 2010-10-31 08:59:55 来源:WEB开发网   
核心提示:3. Activator.CreateInstance(Type)4. Activator.CreateInstance(assemblyName, typeName)5. Assembly.CreateInstance(typeName)最快的是方式 3 ,与 Direct Create 的差异在一个数量级之内,AS
  3. Activator.CreateInstance(Type)
  4. Activator.CreateInstance(assemblyName, typeName)
  5. Assembly.CreateInstance(typeName)
 最快的是方式 3 ,与 Direct Create 的差异在一个数量级之内,约慢 7 倍的水平。其他方式,至少在 40 倍以上,最慢的是方式 4 ,要慢三个数量级。
 1.6.3 动态方法调用
  方法调用分为编译期的早期绑定和运行期的动态绑定两种,称为Early-Bound Invocation和Late-Bound Invocation。Early-Bound Invocation可细分为Direct-call、Interface-call和Delegate-call。Late-Bound Invocation主要有Type.InvokeMember和MethodBase.Invoke,还可以通过使用LCG(Lightweight Code Generation)技术生成IL代码来实现动态调用。
 从测试结果看,相比Direct Call,Type.InvokeMember要接近慢三个数量级;MethodBase.Invoke虽然比Type.InvokeMember要快三 倍,但比Direct Call仍慢270倍左右。可见动态方法调用的性能是非常低下的。我们的建议是:除非要满足特定的需求,否则不要使用!
 1.6.4 推荐的使用原则
 模式
  1. 如果可能,则避免使用反射和动态绑定
  2. 使用接口调用方式将动态绑定改造为早期绑定
  3. 使用Activator.CreateInstance(Type)方式动态创建对象
  4. 使用typeof操作符代替GetType调用
 反模式
  1. 在已获得Type的情况下,却使用Assembly.CreateInstance(type.FullName)

1.7 基本代码技巧
 这里描述一些应用场景下,可以提高性能的基本代码技巧。对处于关键路径的代码,进行这类的优化还是很有意义的。普通代码可以不做要求,但养成一种好的习惯也是有意义的。
 1.7.1 循环写法
  可以把循环的判断条件用局部变量记录下来。局部变量往往被编译器优化为直接使用寄存器,相对于普通从堆或栈中分配的变量速度快。如果访问的是复杂计算属性 的话,提升效果将更明显。for (int i = 0, j = collection.GetIndexOf(item); i < j; i++)
 需要说明的是:这种写法对于CLR集合类的Count属性没有意义,原因是编译器已经按这种方式做了特别的优化。
 1.7.2 拼装字符串
 拼装好之后再删除是很低效的写法。有些方法其循环长度在大部分情况下为1,这种写法的低效就更为明显了:public static string ToString(MetadataKey entityKey)
{
string str = "" ;
object [] vals = entityKey.values;
for ( int i = 0 ; i < vals.Length; i ++ )
{
str += " , " + vals[i].ToString();
}
return str == "" ? "" : str.Remove( 0 , 1 );
}


推荐下面的写法:if (str.Length == 0 )
str = vals[i].ToString();
else
str += " , " + vals[i].ToString();


其实这种写法非常自然,而且效率很高,完全不需要用个Remove方法绕来绕去。
 1.7.3 避免两次检索集合元素
 获取集合元素时,有时需要检查元素是否存在。通常的做法是先调用ContainsKey(或Contains)方法,然后再获取集合元素。这种写法非常符合逻辑。
 但如果考虑效率,可以先直接获取对象,然后判断对象是否为null来确定元素是否存在。对于Hashtable,这可以节省一次GetHashCode调用和n次Equals比较。

如下面的示例:public IData GetItemByID(Guid id)
{
IData data1 = null ;
if ( this .idTable.ContainsKey(id.ToString())
{
data1 = this .idTable[id.ToString()] as IData;
}
return data1;
}

上一页  4 5 6 7 8 9 10 11 12 13 14  下一页

Tags:ASP.NET 性能优化

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