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

ASP.NET性能优化

 2010-10-31 08:59:55 来源:WEB开发网   
核心提示:1. 使用异步方式调用Web服务和远程对象只要有可能就要避免在请求的处理过程中对Web服务和远程对象的同步调用,因为它占用的是的ASP.NET 线程池中的工作线程,ASP.NET性能优化(7),这将直接影响Web服务器响应其它请求的能力,2. 考虑给不需要返回值的Web方法或远程对象的方法添加OneWay属性这种模式能
 1. 使用异步方式调用Web服务和远程对象
 只要有可能就要避免在请求的处理过程中对Web服务和远程对象的同步调用,因为它占用的是的ASP.NET 线程池中的工作线程,这将直接影响Web服务器响应其它请求的能力。

2. 考虑给不需要返回值的Web方法或远程对象的方法添加OneWay属性
 这种模式能让Web Server调用之后就立即返回。可根据实际情况决定是否使用这种方法。

3. 使用工作队列
 将作业提交到服务器上的工作队列中。客户端通过发送请求来轮询作业的执行结果。

3.3 使用缓存
 缓存能在很大程度上决定ASP.NET应用的最终性能。Asp.net支持页面输出缓存和页面部分缓存,并提供Cache API,供应用程序缓存自己的数据。是否使用缓存可考虑下面的要点:
  1. 识别创建与访问代价较大的数据
  2. 评估需要缓存数据的易变性
  3. 评估数据的使用频次
  4. 将要缓存数据中易变数据和不变数据分离,只缓存不变数据
  5. 选择合适的缓存机制(除Asp.net Cache外,Application state和Session state也可以作为缓存使用)

3.4 多线程
 1. 避免在请求处理过程中创建线程
 在执行请求的过程中创建线程是一种代价较大的操作,会严重影响Web Server的性能。如果后续的操作必须用线程完成,建议通过thread pool来创建/管理线程。

2. 不要依赖线程数据槽或线程静态变量
 由于执行请求的线程是ASP.NET thread pool中的工作线程,同一个Client的两次请求不一定由相同的线程来处理。

3. 避免阻塞处理请求的线程
 参考"避免阻塞和长时间的作业"小节。

4. 避免异步调用
 这和1的情况类似。异步调用会导致创建新的线程,增加服务器的负担。所以,如果没有并发的作业要执行,就不要执行异步调用。

3.5 系统资源
  1. 考虑实现资源池以提升性能
  2. 明确地调用Dispose或Close释放系统资源
  3. 不要缓存或长时间占用资源池中的资源
  4. 尽可能晚的申请,尽可能早的释放

3.6 页面处理
 1. 尽量减小Page的尺寸
 包括缩短控件的名称、CSS的class的名称、去掉无谓空行和空格、禁用不需要的ViewState
 2. 启用页面输出的缓冲区(Buffer)
 如果Buffer的机制被关闭,可以用下面的方法打开。
 使用程序打开页面输出缓存:
 Response.BufferOutput = true;

使用@Page开关打开页面输出缓冲机制:
 <%@ Page Buffer = "true" %>

使用Web.config或Machine.config配置文件的<pages>节点:
 <pages buffer="true" …>
 3. 利用Page.IsPostBack优化页面输出
 4. 通过分离页面的不同的内容,来提高缓存效率和减少呈现的时间
 5. 优化复杂和代价较大的循环
 6. 合理利用客户端的计算资源,将一些操作转移到客户端进行

3.7 ViewState
 ViewState是Asp.net为服务端控件在页面回传之间跟踪状态信息而设计的一种机制。
 1. 关闭ViewState
  如果不需要跟踪页面状态,例如页面不会 回传(PostBack)、不需要处理服务端控件事件或者每次页面刷新时都会重新计算控件内容,那么就不需要用ViewState来记录页面状态了。可以 对特定的WebControl设置EnableViewState属性,也可以在页面一级设置:
 <%@ Page EnableViewState="false" %>

2. 在恰当的时间点初始化控件属性
 ASP.NET的控件在执行构造函数、初始化的期间设置的属性不会被跟踪变化;而在初始化阶段之后对属性的修改都会被跟踪,并最终记录到IE页面的__VIEWSTATE之中。所以,选择合理的初始化控件属性的执行点,能有效的减小页面尺寸。

3. 谨慎选择放到ViewState中的内容
 放到ViewState中的内容会被序列化/反序列 化,Asp.net为String、Integer、Boolean等基本类型的序列化做了优化,如果Array、ArrayList、 HashTable存储的是基本类型效率也较高,但其它类型则需要提供类型转换器(Type Converter),否则将使用代价昂贵的二进制序列化程序。

4.1 JScript性能优化的基本原则
 1. 尽可能少地减少执行次数。毕竟对解释语言来说,每一个执行步骤,都需要和解释引擎做一次交互。
 2. 尽可能使用语言内置的功能,比如串链接。
 3. 尽可能使用系统提供的API来进行优化。因为这些API是编译好的二进制代码,执行效率很高。
 4. 书写最正确的代码。容错功能是要付出性能代价的。

4.2 JScript语言本身的优化
 4.2.1 变量
 1. 尽量使用局部变量。
 因为全局变量其实是全局对象的成员,而局部变量在栈上定义,优先查找,性能相对于全局变量要高。

2. 尽量在一个语句中做定义变量和赋值。

3. 省略不必要的变量定义。
 如果变量的定义可以被一个常量替代,就直接使用常量。

4. 使用Object语法对对象赋值。
 Object的赋值语法在操作复杂对象时效率更高。
 例如,可以将下面的代码:
car = new Object();
car.make = "Honda";
car.model = "Civic";
car.transmission = "manual";
car.miles = 100000;
car.condition = "needs work";
替换成:

car = {
make: "Honda",
model: "Civic",
transmission: "manual",
miles: 100000,
condition: "needs work"
}


4.2.2 对象缓存
 1. 缓存对象查找的中间结果。
 因为JavaScript的解释性,所以a.b.c.d.e,需要进行至少4次查询操作,先检查a再检查a中的b,再检查b中的c,如此往下。所以如果这样的表达式重复出现,只要可能,应该尽量少出现这样的表达式,可以利用局部变量,把它放入一个临时的地方进行查询。

2. 缓存创建时间较长的对象。
 自定义高级对象和Date、RegExp对象在构造时都会消耗大量时间。如果可以复用,应采用缓存的方式。

4.2.3 字符串操作
 1. 使用"+=" 追加字符串,使用"+"来连接字符串。
 如果是追加字符串,最好使用s+=anotherStr操作,而不是要使用s=s+anotherStr。
 如果要连接多个字符串,应该使用"+",如:
  s+=a;
  s+=b;
  s+=c;
  应该写成
  s+=a + b + c;

2. 连接大量的字符串,应使用Array的join方法。
 如果是收集字符串,最好使用JavaScript数组缓存,最后使用join方法连接起来,如下:
var buf = new Array();
for (var i = 0; i < 100; i++)
{
buf.push(i.toString());
}

var all = buf.join("");


4.2.4 类型转换
 1. 使用Math.floor()或者Math.round()将浮点数转换成整型。
 浮点数转换成整型,这个更容易出错,很多人喜欢使用parseInt(),其实parseInt()是用于将字符串转换成数字,而不是浮点数和整型之间的转换,我们应该使用Math.floor()或者Math.round()。
 对象查找中的问题不一样,Math是内部对象,所以Math.floor()其实并没有多少查询方法和调用的时间,速度是最快的。

2. 自定义的对象,推荐定义和使用toString()方法来进行类型转换。

上一页  2 3 4 5 6 7 8  下一页

Tags:ASP.NET 性能优化

编辑录入:爽爽 [复制链接] [打 印]
[]
  • 好
  • 好的评价 如果觉得好,就请您
      0%(0)
  • 差
  • 差的评价 如果觉得差,就请您
      0%(0)
赞助商链接