关于ASP的性能优化
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
关于ASP的性能优化
一、性能开发及其优化
性能表示系统执行任务的速度和效率。
就Web站点的性能而言,它对整个站点的点击率起着不可忽视的作用。
1.利用JIT编译器提高程序执行速度
高性能代码旨在能少做工作就少做工作,这是不言而明的。
在编译任何的应用程序时,编译器把源代码转换为Microsoft中间语言(MSIL)。
要在一个具体环境中执行应用程序,一个JIT编译器先接受MSIL输出并把指令转换为主机处理的本机指令,再以即时方式编译代码,以便应用程序开始执行。
但是,JIT编译器不是把程序集中所有的 MSIL都在开始执行前转换为本机代码,只是一次编译一个方法。
JIT编译器采用的这种方法有两个性能上的优势。
第一个优势:这项技术把编译的成本分摊在一个较长的时间内,由于执行会比JIT编译器把所有的MSIL都进行编译看起来要快,这样感觉到应用程序的性能提高了。
如果把长时间的暂停或等待时间分成小块,把它们分散开,你的用户就不会注意到它们,用户对你的应用程序的性能也会比较满意。
第二个优势:JIT编译器不编译在执行期间用不到的方法。
因此不会做没有必要的工作,无论什么时候省去不必要的处理工作,你就会发现可以获得真正的性能增益。
2.减少运行时的工作
在底层,基础结构为了让我们工作轻松,做了大量的基础工作。
虽然把这个体系结构用做一个黑盒很不错,但有时了解使一切如此无缝的运行的实现细节也是很有益的。
掌握了这些额外的信息,我们经常可以更有效地在运行程序时获得速度上的优势。
其实现主要有以下三种方法:
(1)视图状态的优化
视图状态是性能的无声杀手。
自动视图状态管理是服务器控件的功能, 该功能使服务器控件可以在往返过程上重新填充它们的属性值(不需要编写任何代码)。
但是, 因为服务器控件的视图状态在隐藏的窗体字段中往返于服务器, 所以该功能确实会对性能产生影响。
因此, 开发人员应该知道在哪些情况下视图状态会有所帮助, 在哪些情况下它影响配器的性能。
例如, 如果将服务器控件绑定到每个往返过程的数据上, 则将用数据绑定操作获得的新值替换保存的视图状态。
在这种情况下, 禁用视图状态可以节省处理时间。
默认情况下, 为所有服务器控件启用视图状态。
若要禁用视图状态,将控件的EnableViewState 属性设置为false。
从某种意义上说, 视图状态是有史以来最伟大的事情。
毕竟, 视图状态使页面和控件能够在回发之间保持状态。
因此, 不必像在传统的ASP中那样编写代码, 以防止在单击按钮时文本框中的文本消失, 或在回发后重新查询数据库和重新绑定DataGrid。
但是,
视图状态也有缺点: 当它增长得过大时, 某些控件(例如文本框) 会根据视图状态做出相应判断; 其他控件(特别是DataGrid 和GridView) 则根据显示的信息量确定视图状态。
一个糟糕的GridView 容易将浏览器和Web 服务器之间连接的有效带宽减少50%以上。
2.0能够提供比 1.x 更简单的方法将视图状态保留在会话状态中。
(2)尽量减少服务器控件的使用
服务器端的控件不仅能生成视图状态,它们也需要额外的运行时间处理绑定到成员变量。
由于它们会使用服务器资源,即使它们非常易于使用, 但是服务器控件并不总是完成任务的最佳选择, 在许多情况下, 一个简单的呈现或数据绑定代入就可以完成任务。
所以,Web页面上服务器端的控件应该保持在最低的数量上。
(3)把异常减到最少
不要依赖代码中的异常。
因为异常大大地降低性能, 所以不应该将它们用作控制正常程序流程的方式。
异常是通知程序执行期间发生的错误的一个非常有用的设备。
程序不能忽视异常——它们将会改变程序的执行流。
在运行时的托管环境中,用 try和catch设置异常处理代码只对性能有可以忽略不计的影响,但程序抛出异常时却有性能的损失。
如果将try…catch语句使用为if语句,将抛出更少的异常,运行得更快。
3.有效使用内存和缓存
只要可能, 就缓存数据和页面输出。
使用 缓存机制有两点需要注意。
首先, 不要缓存太多项,缓存每个项均有开销, 特别是在内存使用方面。
不要缓存容易重新计算和很少使用的项。
其次, 给缓存的项分配的有效期不要太短。
很快到期的项会导致缓存中不必要的周转, 并且经常导致更多的代码清除和垃圾回收工作。
高周转率可能说明存在问题, 特别是当项在到期前被移除时。
不要给每个请求分配过多内存, 因为这样垃圾回收器将必须更频繁地进行更多工作。
另外, 不要让不必要的指针指向对象, 因为它们将使对象保持活动状态, 并且应尽量避免含Finalize 方法的对象, 因为它们在后面会导致更多的工作。
特别是在Finalize 调用中永远不要释放资源, 因为资源在被垃圾回收器回收之前可能一直消耗着内存。
最后这个问题经常会对Web 服务器环境的性能造成毁灭性的打击, 因为在等待Finalize 运行时, 很容易耗尽某个特定的资源。
附:影响ASP执行效率实例对比
比较慢的例子:
比较快的例子:。