ASP .Net 网页优化清单






3.73/5 (15投票s)
2006年4月14日
5分钟阅读

79720
本文提供了一个简单的清单,可以轻松地在任何 ASP .Net 网页上运行以进行优化。
引言
本文提供了一个简单的清单,可以轻松地在任何 ASP .Net 网页上运行以进行优化。这绝不是一个完整的列表,但它应该适用于大多数网页。对于性能关键型应用程序,您肯定需要超出此清单的范围,并且需要更详细的计划。
所有页面的清单
以下是您需要运行的检查列表,不一定按顺序排列
- 禁用 ViewState - 为不需要视图状态的任何控件设置“EnableViewState=false”。通常,如果您的页面不使用回发,则通常可以安全地禁用整个页面本身的视图状态。
- 在 Page_Load 中使用 Page.IsPostBack - 确保 page_load 中的所有代码都包含在“if (Page.IsPostBack)”中,除非它需要每次 Page Load 时都执行。
- Web 服务的异步调用 - 如果您在页面中使用 Web 服务并且它们加载时间很长,那么最好在适用的地方使用对 Web 服务的异步调用,并确保在页面完全加载之前等待调用的结束。但请记住,异步调用有其自身的开销,因此除非需要,否则不要过度使用。
- 对于大型字符串操作,请使用 StringBuilder - 对于任何长字符串操作,请改用 StringBuilder。
- 专门的异常处理 - 除非需要,否则不要抛出异常,因为抛出异常会降低性能。尝试使用诸如“if not system.dbnull….”之类的代码来管理它们。即使您必须处理异常,也要在“finally”块中取消分配任何内存占用大的对象。不要依赖垃圾回收器为您完成工作。
// // Try // 'Create Db Connection and call a query // sqlConn = New SqlClient.SqlConnection(STR_CONN) // Catch ex As Exception // 'Throw any Error that occurred // Throw ex // Finally // 'Free Database connection objects // sqlConn = Nothing //End Try //
- 保留页面缓冲开启 - 除非有特殊要求,否则请将页面缓冲保持开启。在页面非常大的情况下,您可能需要开启它,以便用户可以在整个页面加载时查看某些内容。
- 使用缓存 - 只要有可能就缓存数据,特别是那些您确定根本不会改变或将在应用程序中重复使用多次的数据。确保有一致的缓存键以避免任何错误。对于不经常更改的简单页面,您也可以选择页面缓存。
// // <% @OutputCache Duration="60" VaryByParam="none" %> //
详细了解“VaryByParam”和“VaryByControl”以获得最佳效果。 - 使用脚本文件 - 作为规则,除非需要,否则不要将 JavaScript 直接插入任何页面,而是将它们保存为脚本文件“.js”并嵌入它们。这样做的好处是公共代码可以共享,并且一旦脚本文件加载到浏览器缓存中,它将直接从浏览器缓存中获取,而不是再次下载。
- 删除未使用的 Javascript - 运行所有 Javascript 并确保删除所有未使用的脚本。
- 使用 Tabstrip 时删除隐藏的 HTML - 如果您使用的是 Tabstrip 控件,并且 HTML 大小过大,页面会频繁重新加载,那么将 Tabstrip 的 Autopostback 设置为 true,将每个 Pageview 放入一个面板中,并将除当前面板外的所有面板的可见性设置为 False。这将强制每次更改选项卡时重新加载页面,但重新加载时间会大大减少。请根据您的具体情况进行最佳使用。
性能关键型页面的附加清单
- 不使用时禁用会话 - 如果您的页面不使用会话,请特别为该页面禁用会话。
// // <%@ Page EnableSessionState="false" %> //
如果页面只读取会话而不向会话写入任何内容,则将其设置为只读。// // '<%@ Page EnableSessionState="ReadOnly" %> //
- 使用 Option Strict On (仅限 VB .Net) - 启用 Option Script 会限制隐式类型转换,这有助于避免那些令人烦恼的类型转换,并且通过消除隐藏的类型转换也是性能的助推器。我同意它剥夺了你的一些自由,但相信我,好处 outweighs 自由。
- 使用多线程 - 下载大量数据时,使用多线程在后台加载数据。但请注意,多线程会带来开销,并且必须谨慎使用。生命周期短的线程本质上效率低下,上下文切换会占用大量的执行时间。您应该使用最少数量的长期线程,并尽可能少地在它们之间切换。
- 使用分块函数 - 分块调用是执行多个任务的函数调用。您应该尝试设计您的应用程序,使其不依赖于开销很大的小型、频繁的调用。
- 使用交错数组 - 如果您大量使用多维数组,请改用交错数组(“数组的数组”)
- 使用“&”而不是“+” - 您应该使用连接运算符(&)而不是加号运算符(+)来连接字符串。它们仅在两个操作数都是 String 类型时才等效。当不是这种情况时,+ 运算符将变为后期绑定,并且必须执行类型检查和转换。
- 使用 Ajax - 在性能关键型应用程序中,存在频繁的页面加载,可以求助于 Ajax。
- 使用 SqlDataReader 类 - SqlDataReader 类提供了一种读取从 SQL Server™ 数据库检索的只读数据流的方法。如果您只需要读取数据,那么 SqlDataReader 类比 DataSet 类提供更高的性能,因为 SqlDataReader 使用 Tabular Data Stream 协议直接从数据库连接读取数据。
- 选择合适的 Session State 提供程序 - 进程内会话状态是最快的解决方案。如果您只在会话状态中存储少量数据,请选择进程内提供程序。当您将应用程序扩展到多个处理器或多台计算机时,进程外解决方案非常有用。
- 使用存储过程 - 存储过程是预编译的,因此比直接 SQL 语句调用快得多。
- 谨慎使用 Web 服务 - Web 服务根据数据量可能会有巨大的内存需求。除非您的业务模式需要,否则不要使用 Web 服务。
- 数据库端分页 - 当您需要向用户显示大量数据时,请采用基于存储过程的数据分页技术,而不是依赖数据网格/数据列表的分页功能。基本上只下载当前页的数据。