锐英源软件
第一信赖

精通

英语

开源

擅长

开发

培训

胸怀四海 

第一信赖

当前位置:锐英源 / 开源技术 / ASP.NET开源 / ASP.NET高性能开发技巧
服务方向
人工智能数据处理
人工智能培训
kaldi数据准备
小语种语音识别
语音识别标注
语音识别系统
语音识别转文字
kaldi开发技术服务
软件开发
运动控制卡上位机
机械加工软件
软件开发培训
Java 安卓移动开发
VC++
C#软件
汇编和破解
驱动开发
联系方式
固话:0371-63888850
手机:138-0381-0136
Q Q:396806883
微信:ryysoft

锐英源精品原创,禁止任何转载或其它形式的非法合作,侵权必究

ASP.NET高性能开发技巧


介绍


ASP.NET比传统的ASP功能强大得多,但了解如何使用该功能构建高效、可靠和强大的应用程序非常重要。在本文中,我试图强调可以用来最大化ASP.NET页面性能的关键技巧。技巧很多,但我只强调最重要的。

1.开发前进行规划和研究


研究和调查.NET的能力真的会让你受益。.NET为应用程序设计和开发的每个级别提供了各种解决方案。您必须了解这种丰富的开发环境支持的每种方法的情况和优缺点。Visual Studio是一个全面的开发包,并提供了许多选项来实现相同的逻辑。检查每个选项并找到适合手头任务的最佳解决方案非常重要。使用分层逻辑将您的应用程序逻辑划分为表示层、业务层和数据访问层。它不但可以帮助您创建可维护的代码,还可以分别监控和优化每个层的性能。清晰的逻辑分隔也为扩展应用程序提供了更多选择。

2.字符串连接


如果处理不当,字符串连接可能会降低应用程序的性能。您可以通过两种方式连接字符串。

  • 首先,通过使用字符串并将新字符串添加到现有字符串。但是,这个操作实际上非常低效(特别是如果你在一个循环内连接字符串)。将字符串添加到现有字符串时,Framework会将现有数据和新数据复制到内存中,删除现有字符串并以新字符串读取数据。在长字符串连接操作中,此操作可能非常耗时并且代价高昂。
  • 第二种更好的连接字符串的方法是使用StringBuilder。以下是两种方法的示例。如果你正在考虑做任何类型的字符串串联,请自己帮忙,并分别测试两个例程。你可能会对结果感到惊讶。

使用+=来直接连接,结果:花了4分23秒来完成10万个连接。
使用StringBuilder,调用Append添加,结果:花了不到一秒完成100,000个连接。

3.避免频繁使用服务器


使用以下提示可以避免不必要的Web服务器频繁使用:

  • 尽可能实现Ajax UI。这个想法是为了避免整页刷新,只更新需要改变的页面部分。
  • 使用客户端脚本。客户端验证可以帮助减少处理用户请求所需的频繁使用调用。在ASP.NET中,您还可以使用客户端控件来验证用户输入。
  • 使用Page.ISPostBack 属性确保您只在第一次加载页面时执行页面初始化逻辑,而不是响应客户端回发。
  • 在某些情况下,执行回发事件处理是不必要的。您可以使用客户端回调从服务器读取数据,而不是执行完整的页面访问。

4.仅在必要时保存视图状态


ViewState 主要由服务器控件使用,仅在将数据发回自己的页面上保留状态。信息被传递给客户端并以隐藏变量读回。ViewState 对于不需要它的页面而言是不必要的开销。随着ViewState 越来越大,它会影响垃圾收集的性能。您可以ViewState 按照以下提示优化应用程序的使用方式:

当你不需要ViewState的情况


ViewState 在ASP.NET中默认打开。您可能不需要,ViewState 因为您的页面是仅输出的,或者是因为您明确地为每个请求重新加载数据。ViewState 在以下情况下不需要:

  • 您的页面不会回传。如果页面不将信息发布回自己,如果页面仅用于输出,并且页面不依赖于响应处理,则不需要ViewState。
  • 您不处理服务器控件事件。如果您的服务器控件不处理事件,并且您的服务器控件没有动态或数据绑定属性值,或者它们在每个请求的代码中设置,则不需要ViewState。
  • 您在每次刷新页面时重新添加控件。如果您忽略旧数据,并且每次页面刷新时都重新填充服务器控件,则不需要ViewState。

禁用视图状态

有几种方法可以ViewState 在各个级别禁用:

  • 要禁用ViewState 页面上的单个控件EnableViewState ,请将该控件的属性设置为false。
  • 要禁用ViewState 单个页面,请EnableViewState 将该@ Page 指令中的属性设置为false。即

<%@ Page EnableViewState="false" %>

  • 要禁用ViewState 特定应用程序,请在应用程序的Web.config文件中使用以下元素:

<pages enableViewState="false" />

  • 要禁用ViewState Web服务器上的所有应用程序,请按如下所示配置Machine.config文件中的<pages>元素:

<pages enableViewState="false" />

确定您的ViewState的大小


通过启用对页面的跟踪,您可以监视每个控件的ViewState 大小。您可以使用此信息来确定可以禁用ViewState的控件,也可以找到控件ViewState需要的最佳大小。

5.小心使用会话变量


避免在会话变量中存储太多数据,并确保您的会话超时是合理的。这可以使用大量的服务器内存。请记住,在用户关闭浏览器后,存储在会话变量中的数据可能会长时间挂起。太多的会话变量会使服务器瘫痪。如果您在特定页面或应用程序中未使用会话变量,请禁用会话状态。

  • 要禁用页面的会话状态EnableSessionState ,请将该@ Page 指令中的属性设置为false. 即

<%@ Page EnableSessionState="false" %>

  • 如果页面需要访问会话变量但不会创建或修改它们,请EnableSessionState 将该@ Page 指令中的属性设置为ReadOnly。即

<%@ Page EnableSessionState="ReadOnly" %>  

  • 要为特定应用程序禁用会话状态,请使用应用程序的Web.config文件中的以下元素。

<sessionState mode='Off'/>

  • 要为Web服务器上的所有应用程序禁用会话状态,请使用Machine.config文件中的以下元素:

<sessionState mode='Off'/>

6.使用Server.Transfer


使用该Server.Transfer方法在同一应用程序中的页面之间重定向。在页面中使用此方法并使用Server.Transfer 语法可避免不必要的客户端重定向。考虑使用Server.Transfer 而不是Response.Redirect。然而,你不能总是用Response.Redirect 调用替换调用Server.Transfer。如果您在重定向期间需要验证和授权检查,请使用,Response.Redirect 而不是Server.Transfer 因为这两种机制不相同。在使用时Response.Redirect,请确保使用接受布尔第二个参数的重载方法,并传递值false 以确保exception 不会引发内部错误。另请注意,您只能用于Server.Transfer 将控制权转移给同一应用程序中的页面。要转移到其他应用程序中的页面,您必须使用Response.Redirect。

7.适当时使用服务器控件,并避免创建深度嵌套控件


HTTP协议是无状态的; 然而,服务器控件提供了通过使用管理页面请求之间的状态了丰富的编程模型ViewState。然而,没有任何东西是免费的,服务器控件需要固定数量的处理来建立控件及其所有子控件。与HTML控件或可能的静态文本相比,这使服务器控件相对昂贵。如果您不需要丰富的交互功能,请将服务器控件替换为要呈现的用户界面的内联表示形式。在下列情况下更换服务器控制器会更好:

  • 您不需要在回发期间保留状态
  • 出现在控件中的数据是静态的,或者控件显示只读数据
  • 您不需要编程访问服务器端的控件

服务器控件的替代方案包括简单渲染、HTML元素、内联Response.Write 调用和原始内联尖括号(<% %>)。权衡必不可少。如果开销是可接受的,并且您的应用程序是在其性能目标的范围内,请避免过度优化。
深度嵌套的控制层次结构复合了创建服务器控件及其子控件的成本。深层嵌套的层次结构创建额外的处理,可以通过使用不同的使用内联控件的设计或使用更平坦的服务器控件层次结构来避免。当你使用诸如Repeater、DataList和DataGrid的控件时,这是特别重要的,因为它们在容器中创建了额外的子控件。

8.选择适合您的解决方案的数据查看控件


根据您选择在Web窗体页面中显示数据的方式,常常在便利性和性能之间进行重大折衷。在您的应用程序中使用它们之前,始终比较控件的优缺点。例如,你可以选择其中的任何三个控件的(DataGrid,DataList 和Repeater)显示的数据,这是你的工作,找出控件将为您提供最大的利益。该DataGrid 控件可以是显示数据的快捷方式,但它在性能方面通常是最昂贵的。通过生成适当的HTML自己渲染数据可能会在一些简单的情况下起作用,但是定制和浏览器定位可以快速抵消所涉及的额外工作。一个Repeater Web服务器控制是便利性与性能之间的妥协。它高效,可定制,可编程。

9.优化代码和异常处理


为了优化复杂的循环,在性能关键代码路径部分,请使用For 代替ForEach 。也不要依赖exception并避免exceptions。由于exceptions导致性能严重受损,因此不应将它们用作控制正常程序流的方式。如果有可能在代码中检测到会导致一个异常,则可用。在处理这种情况之前,不要捕获exception本身。不要用exceptions来控制逻辑。无法打开的数据库连接是exception,但只是输入错误密码需要处理。常见的情况包括:null检查、为被解析为数值的String赋值,或者在应用数学运算之前检查特定值。以下示例演示了可能导致exception 条件的代码和测试代码。两者产生相同的结果。


'Unnecessary use of exception
Try
value = 100 / number
Catch ex As Exception
value = 0
End Try

' Recommended code
If Not number = 0 Then
value = 100 / number
Else
value = 0
End If

检查null 值。如果对象有可能null,检查以确保它不是null,而不是抛出一个exception。当您从ViewState会话状态、应用程序状态或缓存对象以及查询字符串和表单字段变量中检索项时,通常会发生这种情况。例如,请勿使用以下代码来访问会话状态信息。


'Unnecessary use of exception
Try
value = HttpContext.Current.Session("Value").ToString
Catch ex As Exception
Response.Redirect("Main.aspx", False)
End Try

'Recommended code
If Not HttpContext.Current.Session("Value") Is Nothing Then
value = HttpContext.Current.Session("Value").ToString
Else
Response.Redirect("Main.aspx", False)
End If

10.使用DataReader进行快速高效的数据绑定


使用一个DataReader 对象,如果你不需要缓存数据,如果显示只读数据,如果你需要数据尽可能快地加载到控件。DataReader是以前向方式检索只读数据的最佳选择。将数据加载到DataSet 对象中,然后绑定DataSet到控件将移动数据两次。这种方法也会导致构建一个相对较大的开销DataSet。另外,在使用时DataReader,可以使用特定于类型的特定方法来检索数据以获得更好的性能。

11.高效使用分页


允许用户请求和检索比他们消耗的更多数据会给应用程序资源带来不必要的压力。这种不必要的压力会导致CPU利用率增加,内存消耗增加以及响应时间缩短。对于连接速度较慢的客户尤其如此。从可用性的角度来看,大多数用户不希望将成千上万行显示为单个单元。实现分页解决方案,只从数据库中检索所需的数据,并减少数据库的后端工作。您应该优化数据库服务器返回到中间层Web服务器的行数。 < /p>

12.明确地处置或关闭所有资源


为了保证在发生异常时清理资源,请使用try/ finally 块。关闭该finally 子句中的资源。使用try/ finally 块可以确保即使exception 发生资源也能处理资源。在需要之前打开你的连接,一旦完成就关闭它。你的座右铭应始终是“进入,获取/保存数据,走出去”。如果您使用不同的对象,请确保您提供Dispose 方法或Close 方法。在客户端停止使用它之后很久没有调用Close 或Dispose 延长内存中对象的生命。这推迟了清理工作,并可能造成内存压力。数据库连接和文件是应该明确关闭的共享资源的示例。


Try
_con.Open()
Catch ex As Exception
Throw ex
Finally
If Not _con Is Nothing Then
_con.Close()
End If
End Try

13.禁用跟踪和调试


在部署应用程序之前,禁用跟踪和调试。跟踪和调试可能会导致性能问题。当您的应用程序正在运行时,不建议跟踪和调试。您可以使用以下语法在Machine.configWeb.config禁用跟踪和调试:


<configuration>
<system.web>
<trace enabled="false" pageOutput="false" />
<compilation debug="false" />
</system.web>
</configuration>

14.预编译页面并禁用AutoEventWireup


通过预编译页面,用户不必体验ASP.NET文件的批量编译; 它会提高用户体验的性能。
此外,设置Machine.config文件中AutoEventWireup 属性为false 意味着页面不会匹配方法名称到事件上和挂钩对应(例如Page_Load)。如果页面开发人员想要使用这些事件,他们将需要重写基类中的方法(例如,他们需要覆盖Page.OnLoad 页面加载事件而不是使用Page_Load 方法)。如果禁用AutoEventWireup,则通过将事件连线留给页面作者而不是自动执行,您的页面将略微提升性能。

15.使用存储过程和索引


在大多数情况下,您可以通过使用编译存储过程而不是实时查询来获得额外的性能提升。
确保你索引你的表,并明智地选择你的索引。尝试使用索引调整向导,并让它向您报告它认为索引的最佳候选项是什么。您不必遵循所有建议,但可能会揭示有关您的结构或数据的信息,这些信息可帮助您选择更合适的索引。

  • 在SQL Server Management Studio(SQL Server 2005)中,突出显示您的查询。现在从“查询”菜单中,单击“在数据库引擎优化顾问中分析查询”。
  • 您可以在SQL Server 2000中执行类似的操作来运行索引调整向导。在查询分析器中,突出显示查询。从查询菜单中,单击索引调整向导。
友情链接
版权所有 Copyright(c)2004-2021 锐英源软件
公司注册号:410105000449586 豫ICP备08007559号 最佳分辨率 1024*768
地址:郑州大学北校区院(文化路97号院)内