精通
英语
和
开源
,
擅长
开发
与
培训
,
胸怀四海
第一信赖
锐英源精品原创,禁止任何转载或其它形式的非法合作,侵权必究
ASP.NET比传统的ASP功能强大得多,但了解如何使用该功能构建高效、可靠和强大的应用程序非常重要。在本文中,我试图强调可以用来最大化ASP.NET页面性能的关键技巧。技巧很多,但我只强调最重要的。
研究和调查.NET的能力真的会让你受益。.NET为应用程序设计和开发的每个级别提供了各种解决方案。您必须了解这种丰富的开发环境支持的每种方法的情况和优缺点。Visual Studio是一个全面的开发包,并提供了许多选项来实现相同的逻辑。检查每个选项并找到适合手头任务的最佳解决方案非常重要。使用分层逻辑将您的应用程序逻辑划分为表示层、业务层和数据访问层。它不但可以帮助您创建可维护的代码,还可以分别监控和优化每个层的性能。清晰的逻辑分隔也为扩展应用程序提供了更多选择。
如果处理不当,字符串连接可能会降低应用程序的性能。您可以通过两种方式连接字符串。
使用+=来直接连接,结果:花了4分23秒来完成10万个连接。
使用StringBuilder,调用Append添加,结果:花了不到一秒完成100,000个连接。
使用以下提示可以避免不必要的Web服务器频繁使用:
ViewState 主要由服务器控件使用,仅在将数据发回自己的页面上保留状态。信息被传递给客户端并以隐藏变量读回。ViewState 对于不需要它的页面而言是不必要的开销。随着ViewState 越来越大,它会影响垃圾收集的性能。您可以ViewState 按照以下提示优化应用程序的使用方式:
ViewState 在ASP.NET中默认打开。您可能不需要,ViewState 因为您的页面是仅输出的,或者是因为您明确地为每个请求重新加载数据。ViewState 在以下情况下不需要:
有几种方法可以ViewState 在各个级别禁用:
<%@ Page EnableViewState="false" %>
<pages enableViewState="false" />
<pages enableViewState="false" />
通过启用对页面的跟踪,您可以监视每个控件的ViewState 大小。您可以使用此信息来确定可以禁用ViewState的控件,也可以找到控件ViewState需要的最佳大小。
避免在会话变量中存储太多数据,并确保您的会话超时是合理的。这可以使用大量的服务器内存。请记住,在用户关闭浏览器后,存储在会话变量中的数据可能会长时间挂起。太多的会话变量会使服务器瘫痪。如果您在特定页面或应用程序中未使用会话变量,请禁用会话状态。
<%@ Page EnableSessionState="false" %>
<%@ Page EnableSessionState="ReadOnly" %>
<sessionState mode='Off'/>
<sessionState mode='Off'/>
使用该Server.Transfer方法在同一应用程序中的页面之间重定向。在页面中使用此方法并使用Server.Transfer 语法可避免不必要的客户端重定向。考虑使用Server.Transfer 而不是Response.Redirect。然而,你不能总是用Response.Redirect 调用替换调用Server.Transfer。如果您在重定向期间需要验证和授权检查,请使用,Response.Redirect 而不是Server.Transfer 因为这两种机制不相同。在使用时Response.Redirect,请确保使用接受布尔第二个参数的重载方法,并传递值false 以确保exception 不会引发内部错误。另请注意,您只能用于Server.Transfer 将控制权转移给同一应用程序中的页面。要转移到其他应用程序中的页面,您必须使用Response.Redirect。
HTTP协议是无状态的; 然而,服务器控件提供了通过使用管理页面请求之间的状态了丰富的编程模型ViewState。然而,没有任何东西是免费的,服务器控件需要固定数量的处理来建立控件及其所有子控件。与HTML控件或可能的静态文本相比,这使服务器控件相对昂贵。如果您不需要丰富的交互功能,请将服务器控件替换为要呈现的用户界面的内联表示形式。在下列情况下更换服务器控制器会更好:
服务器控件的替代方案包括简单渲染、HTML元素、内联Response.Write 调用和原始内联尖括号(<% %>)。权衡必不可少。如果开销是可接受的,并且您的应用程序是在其性能目标的范围内,请避免过度优化。
深度嵌套的控制层次结构复合了创建服务器控件及其子控件的成本。深层嵌套的层次结构创建额外的处理,可以通过使用不同的使用内联控件的设计或使用更平坦的服务器控件层次结构来避免。当你使用诸如Repeater、DataList和DataGrid的控件时,这是特别重要的,因为它们在容器中创建了额外的子控件。
根据您选择在Web窗体页面中显示数据的方式,常常在便利性和性能之间进行重大折衷。在您的应用程序中使用它们之前,始终比较控件的优缺点。例如,你可以选择其中的任何三个控件的(DataGrid,DataList 和Repeater)显示的数据,这是你的工作,找出控件将为您提供最大的利益。该DataGrid 控件可以是显示数据的快捷方式,但它在性能方面通常是最昂贵的。通过生成适当的HTML自己渲染数据可能会在一些简单的情况下起作用,但是定制和浏览器定位可以快速抵消所涉及的额外工作。一个Repeater Web服务器控制是便利性与性能之间的妥协。它高效,可定制,可编程。
为了优化复杂的循环,在性能关键代码路径部分,请使用For 代替ForEach 。也不要依赖exception并避免exceptions。由于exceptions导致性能严重受损,因此不应将它们用作控制正常程序流的方式。如果有可能在代码中检测到会导致一个异常,则可用。在处理这种情况之前,不要捕获exception本身。不要用exceptions来控制逻辑。无法打开的数据库连接是exception,但只是输入错误密码需要处理。常见的情况包括:null检查、为被解析为数值的String赋值,或者在应用数学运算之前检查特定值。以下示例演示了可能导致exception 条件的代码和测试代码。两者产生相同的结果。
' Recommended code
If Not number = 0 Then
value = 100 / number
Else
value = 0
End If
检查null 值。如果对象有可能null,检查以确保它不是null,而不是抛出一个exception。当您从ViewState会话状态、应用程序状态或缓存对象以及查询字符串和表单字段变量中检索项时,通常会发生这种情况。例如,请勿使用以下代码来访问会话状态信息。
使用一个DataReader 对象,如果你不需要缓存数据,如果显示只读数据,如果你需要数据尽可能快地加载到控件。DataReader是以前向方式检索只读数据的最佳选择。将数据加载到DataSet 对象中,然后绑定DataSet到控件将移动数据两次。这种方法也会导致构建一个相对较大的开销DataSet。另外,在使用时DataReader,可以使用特定于类型的特定方法来检索数据以获得更好的性能。
允许用户请求和检索比他们消耗的更多数据会给应用程序资源带来不必要的压力。这种不必要的压力会导致CPU利用率增加,内存消耗增加以及响应时间缩短。对于连接速度较慢的客户尤其如此。从可用性的角度来看,大多数用户不希望将成千上万行显示为单个单元。实现分页解决方案,只从数据库中检索所需的数据,并减少数据库的后端工作。您应该优化数据库服务器返回到中间层Web服务器的行数。 < /p>
为了保证在发生异常时清理资源,请使用try/ finally 块。关闭该finally 子句中的资源。使用try/ finally 块可以确保即使exception 发生资源也能处理资源。在需要之前打开你的连接,一旦完成就关闭它。你的座右铭应始终是“进入,获取/保存数据,走出去”。如果您使用不同的对象,请确保您提供Dispose 方法或Close 方法。在客户端停止使用它之后很久没有调用Close 或Dispose 延长内存中对象的生命。这推迟了清理工作,并可能造成内存压力。数据库连接和文件是应该明确关闭的共享资源的示例。
在部署应用程序之前,禁用跟踪和调试。跟踪和调试可能会导致性能问题。当您的应用程序正在运行时,不建议跟踪和调试。您可以使用以下语法在Machine.config和Web.config中禁用跟踪和调试:
通过预编译页面,用户不必体验ASP.NET文件的批量编译; 它会提高用户体验的性能。
此外,设置Machine.config文件中AutoEventWireup 属性为false 意味着页面不会匹配方法名称到事件上和挂钩对应(例如Page_Load)。如果页面开发人员想要使用这些事件,他们将需要重写基类中的方法(例如,他们需要覆盖Page.OnLoad 页面加载事件而不是使用Page_Load 方法)。如果禁用AutoEventWireup,则通过将事件连线留给页面作者而不是自动执行,您的页面将略微提升性能。
在大多数情况下,您可以通过使用编译存储过程而不是实时查询来获得额外的性能提升。
确保你索引你的表,并明智地选择你的索引。尝试使用索引调整向导,并让它向您报告它认为索引的最佳候选项是什么。您不必遵循所有建议,但可能会揭示有关您的结构或数据的信息,这些信息可帮助您选择更合适的索引。