linux社区爱心援助Linux认证系列教程业界动态站务新闻公司招聘网络学院网址大全LPI专题CISCO专题
设为首页
加入收藏
管理团队
JSP  
JAVA  
PERL  
 您的位置:首页 > 开发语言 > asp.net >
栏目导栏
  php
  JSP
  ASP
  asp.net
  JAVA
  c/c++/c#
  perl
  JavaScript
  Basic
  Delphi
资料搜索
热门文章
·NetBPM工作流的一个示例:请假
·Office Web Components(OWC)绘
·asp.net正则表达式语法
·asp.net 2.0 ajax中使用PopupC
·Ado.Net读取Excel常见问题总结
·数据源为空时如何让GridView显
·如何让UpdatePanel支持文件上传
·C#.Net的常见面试试题和参考答
·asp.net ajax客户端编程+jquer
·Brettle.Web.NeatUpload.dll支
·ASP.NET使用Cookie
·ASP.NET DEMO 15: 同时支持行单
·如何使IE的后退按钮无效
·如何在ASP.NET中用OWC绘制图表
·asp.net:正确判断当前用户角色
最新文章
·Ajax Control Toolkit Animati
·讨论一下类似BlogEngine内一次
·使用CSS+SiteMap+UserControl+
·Asp.net中多彩下拉框的实现
·浅谈ASP.NET的Postback
·分清ASP.NET AJAX中的Extender
·Tip:在使用AjaxControlTookit
·有关注册DataItem的一些可能被
·IIRF(Ionic's Isapi Rewrite
·asp.net 客户端回调功能的实现
·关于控件部分的看法--读Progra
·为什么在vista上做开发
·如何封装JS和CSS文件为服务器端
·岂今我看过的最强的排序算法
·设计模式学习笔记之单件模式
Google
 
asp.net性能的技巧
[ 作者:  加入时间:2007-10-26 13:23:05  来自:Linux联盟收集整理 ]
 1. 数据库访问性能优化 yQyLinux联盟
   yQyLinux联盟
  数据库的连接和关闭 yQyLinux联盟
   yQyLinux联盟
  访问数据库资源需要创建连接、打开连接和关闭连接几个操作。这些过程需要多次与数据库交换信息以通过身份验证,比较耗费服务器资源。ASP.NET中提供了连接池(Connection Pool)改善打开和关闭数据库对性能的影响。系统将用户的数据库连接放在连接池中,需要时取出,关闭时收回连接,等待下一次的连接请求。 yQyLinux联盟
   yQyLinux联盟
  连接池的大小是有限的,如果在连接池达到最大限度后仍要求创建连接,必然大大影响性能。因此,在建立数据库连接后只有在真正需要操作时才打开连接,使用完毕后马上关闭,从而尽量减少数据库连接打开的时间,避免出现超出连接限制的情况。 yQyLinux联盟
   yQyLinux联盟
  使用存储过程 yQyLinux联盟
   yQyLinux联盟
  存储过程是存储在服务器上的一组预编译的SQL语句,类似于DOS系统中的批处理文件。存储过程具有对数据库立即访问的功能,信息处理极为迅速。使用存储过程可以避免对命令的多次编译,在执行一次后其执行规划就驻留在高速缓存中,以后需要时只需直接调用缓存中的二进制代码即可。 yQyLinux联盟
   yQyLinux联盟
  另外,存储过程在服务器端运行,独立于ASP.NET程序,便于修改,最重要的是它可以减少数据库操作语句在网络中的传输。 yQyLinux联盟
   yQyLinux联盟
  优化查询语句 yQyLinux联盟
   yQyLinux联盟
  ASP.NET中ADO连接消耗的资源相当大,SQL语句运行的时间越长,占用系统资源的时间也越长。因此,尽量使用优化过的SQL语句以减少执行时间。比如,不在查询语句中包含子查询语句,充分利用索引等。 yQyLinux联盟
   yQyLinux联盟
  2. 字符串操作性能优化 yQyLinux联盟
   yQyLinux联盟
  使用值类型的ToString方法 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  在连接字符串时,经常使用"+"号直接将数字添加到字符串中。这种方法虽然简单,也可以得到正确结果,但是由于涉及到不同的数据类型,数字需要通过装箱操作转化为引用类型才可以添加到字符串中。但是装箱操作对性能影响较大,因为在进行这类处理时,将在托管堆中分配一个新的对象,原有的值复制到新创建的对 象中。 yQyLinux联盟
   yQyLinux联盟
  使用值类型的ToString方法可以避免装箱操作,从而提高应用程序性能。 yQyLinux联盟
   yQyLinux联盟
  运用StringBuilder类 yQyLinux联盟
   yQyLinux联盟
  String类对象是不可改变的,对于String对象的重新赋值在本质上是重新创建了一个String对象并将新值赋予该对象,其方法ToString对性能的提高并非很显著。 yQyLinux联盟
   yQyLinux联盟
  在处理字符串时,最好使用StringBuilder类,其.NET 命名空间是System.Text。该类并非创建新的对象,而是通过Append,Remove,Insert等方法直接对字符串进行操作,通过ToString方法返回操作结果。 yQyLinux联盟
   yQyLinux联盟
  其定义及操作语句如下所示: yQyLinux联盟
   yQyLinux联盟
  int num; yQyLinux联盟
   yQyLinux联盟
  System.Text.StringBuilder str = new System.Text.StringBuilder(); //创建字符串 yQyLinux联盟
   yQyLinux联盟
  str.Append(num.ToString()); //添加数值num yQyLinux联盟
   yQyLinux联盟
  Response.Write(str.ToString); //显示操作结果 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   3. 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要 yQyLinux联盟
   yQyLinux联盟
  默认情况下,ASP.NET 配置被设置成启用最广泛的功能并尽量适应最常见的方案。因此,应用程序开发人员可以根据应用程序所使用的功能,优化和更改其中的某些配置,以提高应用程序的性能。下面的列表是您应该考虑的一些选项。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  仅对需要的应用程序启用身份验证。默认情况下,身份验证模式为 Windows,或集成 NTLM。大多数情况下,对于需要身份验证的应用程序,最好在 Machine.config 文件中禁用身份验证,并在 Web.config 文件中启用身份验证。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  根据适当的请求和响应编码设置来配置应用程序。ASP.NET 默认编码格式为 UTF-8。如果您的应用程序为严格的 ASCII,请配置应用程序使用 ASCII 以获得稍许的性能提高。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  考虑对应用程序禁用 AutoEventWireup。在 Machine.config 文件中将 AutoEventWireup 属性设置为 false,意味着页面不将方法名与事件进行匹配和将两者挂钩(例如 Page_Load)。如果页面开发人员要使用这些事件,需要在基类中重写这些方法(例如,需要为页面加载事件重写 Page.OnLoad,而不是使用 Page_Load 方法)。如果禁用 AutoEventWireup,页面将通过将事件连接留给页面作者而不是自动执行它,获得稍许的性能提升。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  从请求处理管线中移除不用的模块。默认情况下,服务器计算机的 Machine.config 文件中 <httpModules> 节点的所有功能均保留为激活。根据应用程序所使用的功能,您可以从请求管线中移除不用的模块以获得稍许的性能提升。检查每个模块及其功能,并按您的需要自 定义它。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  例如,如果您在应用程序中不使用会话状态和输出缓存,则可以从 <httpModules> 列表中移除它们,以便请求在不执行其他有意义的处理时,不必执行每个模块的进入和离开代码。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  4. 一定要禁用调试模式 yQyLinux联盟
   yQyLinux联盟
  在部署生产应用程序或进行任何性能测量之前,始终记住禁用调试模式。如果启用了调试模式,应用程序的性能可能受到非常大的影响。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  5. 对于广泛依赖外部资源的应用程序,请考虑在多处理器计算机上启用网络园艺 yQyLinux联盟
   yQyLinux联盟
  ASP.NET 进程模型帮助启用多处理器计算机上的可缩放性,将工作分发给多个进程(每个 CPU 一个),并且每个进程都将处理器关系设置为其 CPU。此技术称为网络园艺。如果应用程序使用较慢的数据库服务器或调用具有外部依赖项的 COM 对象(这里只是提及两种可能性),则为您的应用程序启用网络园艺是有益的。但是,在决定启用网络园艺之前,您应该测试应用程序在网络园中的执行情况。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  6. 只要可能,就缓存数据和页输出 yQyLinux联盟
   yQyLinux联盟
  ASP.NET 提供了一些简单的机制,它们会在不需要为每个页请求动态计算页输出或数据时缓存这些页输出或数据。另外,通过设计要进行缓存的页和数据请求(特别是在站点中预期将有较大通讯量的区域),可以优化这些页的性能。与 .NET Framework 的任何 Web 窗体功能相比,适当地使用缓存可以更好的提高站点的性能,有时这种提高是超数量级的。 yQyLinux联盟
   yQyLinux联盟
  使用 ASP.NET 缓存机制有两点需要注意。首先,不要缓存太多项。缓存每个项均有开销,特别是在内存使用方面。不要缓存容易重新计算和很少使用的项。其次,给缓存的项分配的有效期不要太短。很快到期的项会导致缓存中不必要的周转,并且经常导致更多的代码清除和垃圾回收工作。若关心此问题,请监视与 ASP.NET Applications 性能对象关联的 Cache Total Turnover Rate 性能计数器。高周转率可能说明存在问题,特别是当项在到期前被移除时。这也称作内存压力。 yQyLinux联盟
   yQyLinux联盟
  7. 选择适合页面或应用程序的数据查看机制 yQyLinux联盟
   yQyLinux联盟
  根据您选择在 Web 窗体页显示数据的方式,在便利和性能之间常常存在着重要的权衡。例如,DataGrid Web 服务器控件可能是一种显示数据的方便快捷的方法,但就性能而言它的开销常常是最大的。在某些简单的情况下,您通过生成适当的 HTML 自己呈现数据可能很有效,但是自定义和浏览器定向会很快抵销所获得的额外功效。Repeater Web 服务器控件是便利和性能的折衷。它高效、可自定义且可编程。 yQyLinux联盟
   yQyLinux联盟
  8. 将 SqlDataReader 类用于快速只进数据游标 yQyLinux联盟
   yQyLinux联盟
  SqlDataReader 类提供了一种读取从 sql Server 数据库检索的只进数据流的方法。如果当创建 ASP.NET 应用程序时出现允许您使用它的情况,则 SqlDataReader 类提供比 DataSet 类更高的性能。情况之所以这样,是因为 SqlDataReader 使用 sql Server 的本机网络数据传输格式从数据库连接直接读取数据。另外,SqlDataReader 类实现 IEnumerable 接口,该接口也允许您将数据绑定到服务器控件。有关更多信息,请参见 SqlDataReader 类。有关 ASP.NET 如何访问数据的信息,请参见通过 ASP.NET 访问数据。 yQyLinux联盟
   yQyLinux联盟
  9. 将 sql Server 存储过程用于数据访问 yQyLinux联盟
   yQyLinux联盟
  在 .NET Framework 提供的所有数据访问方法中,基于 sql Server 的数据访问是生成高性能、可缩放 Web 应用程序的推荐选择。使用托管 sql Server 提供程序时,可通过使用编译的存储过程而不是特殊查询获得额外的性能提高。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  10. 避免单线程单元 (STA) COM 组件 yQyLinux联盟
   yQyLinux联盟
  默认情况下,ASP.NET 不允许任何 STA COM 组件在页面内运行。若要运行它们,必须在 .aspx 文件内将 ASPCompat=true 属性包含在 @ Page 指令中。这样就将执行用的线程池切换到 STA 线程池,而且使 HttpContext 和其他内置对象可用于 COM 对象。前者也是一种性能优化,因为它避免了将多线程单元 (MTA) 封送到 STA 线程的任何调用。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  使用 STA COM 组件可能大大损害性能,应尽量避免。若必须使用 STA COM 组件,如在任何 interop 方案中,则应在执行期间进行大量调用并在每次调用期间发送尽可能多的信息。另外,小心不要在构造页面期间创建任何 STA COM 组件。例如下面的代码中,在页面构造时将实例化由某个线程创建的 MySTAComponent,而该线程并不是将运行页面的 STA 线程。这可能对性能有不利影响,因为要构造页面就必须完成 MTA 和 STA 线程之间的封送处理。 yQyLinux联盟
   yQyLinux联盟
  <%@ Page Language="VB" ASPCompat="true" %> yQyLinux联盟
   yQyLinux联盟
  <script runat=server> yQyLinux联盟
   yQyLinux联盟
  Dim myComp as new MySTAComponent() yQyLinux联盟
   yQyLinux联盟
  Public Sub Page_Load() yQyLinux联盟
   yQyLinux联盟
  myComp.Name = "Bob" yQyLinux联盟
   yQyLinux联盟
  End Sub yQyLinux联盟
   yQyLinux联盟
  </script> yQyLinux联盟
   yQyLinux联盟
  <html> yQyLinux联盟
   yQyLinux联盟
  <% yQyLinux联盟
   yQyLinux联盟
  Response.Write(myComp.SayHello) yQyLinux联盟
   yQyLinux联盟
  %> yQyLinux联盟
   yQyLinux联盟
  </html> yQyLinux联盟
   yQyLinux联盟
  首选机制是推迟对象的创建,直到以后在 STA 线程下执行上述代码,如下面的例子所示。 yQyLinux联盟
   yQyLinux联盟
  <%@ Page Language="VB" ASPCompat="true" %> yQyLinux联盟
   yQyLinux联盟
  <script runat=server> yQyLinux联盟
   yQyLinux联盟
  Dim myComp yQyLinux联盟
   yQyLinux联盟
  Public Sub Page_Load() yQyLinux联盟
   yQyLinux联盟
  myComp = new MySTAComponent() yQyLinux联盟
   yQyLinux联盟
  myComp.Name = "Bob" yQyLinux联盟
   yQyLinux联盟
  End Sub yQyLinux联盟
   yQyLinux联盟
  </script> yQyLinux联盟
   yQyLinux联盟
  <html> yQyLinux联盟
   yQyLinux联盟
  <% yQyLinux联盟
   yQyLinux联盟
  Response.Write(myComp.SayHello) yQyLinux联盟
   yQyLinux联盟
  %> yQyLinux联盟
   yQyLinux联盟
  </html> yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
     推荐的做法是在需要时或者在 Page_Load 方法中构造任何 COM 组件和外部资源。 yQyLinux联盟
   yQyLinux联盟
  永远不要将任何 STA COM 组件存储在可以由构造它的线程以外的其他线程访问的共享资源里。这类资源包括像缓存和会话状态这样的资源。即使 STA 线程调用 STA COM 组件,也只有构造此 STA COM 组件的线程能够实际为该调用服务,而这要求封送处理对创建者线程的调用。此封送处理可能产生重大的性能损失和可伸缩性问题。在这种情况下,请研究一下使 COM 组件成为 MTA COM 组件的可能性,或者更好的办法是迁移代码以使对象成为托管对象。 yQyLinux联盟
   yQyLinux联盟
  11. 将调用密集型的 COM 组件迁移到托管代码 yQyLinux联盟
   yQyLinux联盟
  .NET Framework 提供了一个简单的方法与传统的 COM 组件进行交互。其优点是可以在保留现有投资的同时利用新的平台。但是在某些情况下,保留旧组件的性能开销使得将组件迁移到托管代码是值得的。每一情况都是不一样的,决定是否需要迁移组件的最好方法是对 Web 站点运行性能测量。建议您研究一下如何将需要大量调用以进行交互的任何 COM 组件迁移到托管代码。 yQyLinux联盟
   yQyLinux联盟
  许多情况下不可能将旧式组件迁移到托管代码,特别是在最初迁移 Web 应用程序时。在这种情况下,最大的性能障碍之一是将数据从非托管环境封送到托管环境。因此,在交互操作中,请在任何一端执行尽可能多的任务,然后进行一个大调用而不是一系列小调用。例如,公共语言运行库中的所有字符串都是 Unicode 的,所以应在调用托管代码之前将组件中的所有字符串转换成 Unicode 格式。 yQyLinux联盟
   yQyLinux联盟
  另外,一处理完任何 COM 对象或本机资源就释放它们。这样,其他请求就能够使用它们,并且最大限度地减少了因稍后请求垃圾回收器释放它们所引起的性能问题。 yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  12. 在 Visual Basic .NET 或 JScript 代码中使用早期绑定 yQyLinux联盟
   yQyLinux联盟
  以往,开发人员喜欢使用 Visual Basic、VBScript 和 JScript 的原因之一就是它们所谓“无类型”的性质。变量不需要显式类型声明,并能够简单地通过使用来创建它们。当从一个类型到另一个类型进行分配时,转换将自动执行。不过,这种便利会大大损害应用程序的性能。 yQyLinux联盟
   yQyLinux联盟
  Visual Basic 现在通过使用 Option Strict 编译器指令来支持类型安全编程。为了向后兼容,默认情况下,ASP.NET 不启用该选项。但是,为了得到最佳性能,强烈建议在页中启用该选项。若要启用 Option Strict,请将 Strict 属性包括在 @ Page 指令中,或者,对于用户控件,请将该属性包括在 @ Control 指令中。下面的示例演示了如何设置该属性,并进行了四个变量调用以显示使用该属性是如何导致编译器错误的。 yQyLinux联盟
   yQyLinux联盟
  <%@ Page Language="VB" Strict="true" %> yQyLinux联盟
   yQyLinux联盟
  <% yQyLinux联盟
   yQyLinux联盟
  Dim B yQyLinux联盟
   yQyLinux联盟
  Dim C As String yQyLinux联盟
   yQyLinux联盟
  ' This will cause a compiler error. yQyLinux联盟
   yQyLinux联盟
  A = "Hello" yQyLinux联盟
   yQyLinux联盟
  ' This will cause a compiler error. yQyLinux联盟
   yQyLinux联盟
  B = "World" yQyLinux联盟
   yQyLinux联盟
  ' This will not cause a compiler error. yQyLinux联盟
   yQyLinux联盟
  C = "!!!!!!" yQyLinux联盟
   yQyLinux联盟
  ' But this will cause a compiler error. yQyLinux联盟
   yQyLinux联盟
  C = 0 yQyLinux联盟
   yQyLinux联盟
  %> yQyLinux联盟
   yQyLinux联盟
  JScript .NET 也支持无类型编程,但它不提供强制早期绑定的编译器指令。若发生下面任何一种情况,则变量是晚期绑定的: yQyLinux联盟
   yQyLinux联盟
  被显式声明为 Object。 yQyLinux联盟
   yQyLinux联盟
  是无类型声明的类的字段。 yQyLinux联盟
   yQyLinux联盟
  是无显式类型声明的专用函数或方法成员,并且无法从其使用推断出类型。 yQyLinux联盟
   yQyLinux联盟
  最后一个差别比较复杂,因为如果 JScript .NET 编译器可以根据变量的使用情况推断出类型,它就会进行优化。在下面的示例中,变量 A 是早期绑定的,但变量 B 是晚期绑定的。 yQyLinux联盟
   yQyLinux联盟
  var A; yQyLinux联盟
   yQyLinux联盟
  var B; yQyLinux联盟
   yQyLinux联盟
  A = "Hello"; yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  B = "World"; yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
  B = 0; yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
   yQyLinux联盟
     为了获得最佳的性能,当声明 JScript .NET 变量时,请为其分配一个类型。例如,var A : String。 yQyLinux联盟
Linux联盟收集整理 ,转贴请标明原始链接,如有任何疑问欢迎来本站Linux论坛讨论
分页:[1] 2 3
评论】【加入收藏夹】【 】【打印】【关闭
※ 相关链接
 ·DELPHI中操作ACCESS技巧集  (2007-10-30 16:08:48)
 ·Delphi中树型控件的使用技巧  (2007-10-30 15:41:50)
 ·如何优化JavaScript脚本的性能  (2007-10-30 14:25:25)
 ·网页实用技巧:随机显示不同页面背景  (2007-10-30 13:55:09)
 ·内存调试技巧:C 语言最大难点揭秘  (2007-10-30 13:45:40)
 ·ADO.NET、NBear和NHibernate和IbatisNet简单读写性能比较  (2007-10-29 14:27:18)
 ·如何将asp.net的后台cs代码移动到页面上  (2007-10-29 14:25:45)
 ·关于字符串为空的几个性能测试  (2007-10-29 14:23:10)
 ·读Programming ASP.NET中文版控件  (2007-10-29 14:15:23)
 ·ASP.NET 2.0如何封装JS和CSS文件为服务器端控件  (2007-10-29 14:13:11)