• 1
  • 2
  • 3
  • 4
  • 5
asp.net空间 首 页  »  帮助中心  »  虚拟主机  »  asp.net空间
分析ASP.Net应用程序性能提高的方法(二)
发布日期:2015-10-14 11:10:49

       分析ASP.Net应用程序性能提高的方法(二)

       之前,我们针对ASP.Net应用程序性能提高的经验作了简单的总结。但是,根据反馈不太具体,这里将具体分析ASP.Net应用程序性能提高的方法。

    目前.NET平台是主流的软件开发平台之一,在各个软件开发派系相互竞争,相互促进的今天,它们共同推动了国际IT技术的发展。技术的不断发展也使得现在写一个asp.net的web应用程序变得非常的容易,也是因为这样许多开发人员也更倾向于这种方。所以许多的程序员都不愿花时间去构建一个性能良好的应用程序。这里本文将要为您介绍提高web应用程序性能的十大方法。当然,本文也不能提供一个完整提高web应用程序性能的详细指南,因为这需要的篇幅不是短短一篇或几篇文章可以阐述清楚的,也只是对这十种方法做个介绍。

  5..使用后台处理

  通过之前的方法你的程序应该运行得很快了。虽然应用程序性能提高了,运行速度也有很大提高,但是生命不停,奋斗不止。程序在某些时候,其中的一次请求中可能要执行一个非常耗时的任务。如发送邮件或者是检查提交的数据的正确性等。

  除此之外,当我们把asp.net Forums 1.0集成在CS中的时侯,发现提交一个新的帖子的时候会非常的慢。这是因为,每次新增一个帖子的时侯,应用程序首先要检查这个帖子是不是重复提的,然后用“badword”过滤器来过滤,检查图片附加码,作帖子的索引,再把它添加到合适的队列中,验证它的附件,最后,发邮件到它的订阅者邮件箱中。显然通过上述描述,我们可以这个工作量之大。

  本来做帖子的索引是一项很耗时的操作,而发邮件给订阅都需要连接到SMTP服务,然后给每一个订阅者都发一封邮件,随着订阅用户的增加,发送邮件的时间会更长。结果是它把大量的时间都花在做索引和发送邮件中了。

  然后,我们就像索引和发邮件并不需要在每次请求时触发,这样理想状态下,我们想要批量的处理这些操作,每次只发25封邮件或者每隔5分钟把所有的要发的新邮件发一次。我们决定使用与数据库原型缓存一样的代码,但是失败了,所以又不得不回到VS.NET 2005。

  后来,我们在System.Threading命名空间下找到了Timer类,这个类非常有用,Web开发人员却很少有人知道。一旦他建了该类的实例,每隔一个指定的时间,Timer类就会从线程池中的一个线程中调用指定的回调函数。这意味着你的asp.net应用程序可以在没有请求的时候也可以运行。这就是后以处理的解决方案。你就可以让做索引和发邮件工作在后台运行,而不是在每次请求的时候必须执行。

  但是这种后台运行的技术有两个问题,第一是,当你的应用程序域卸载后,Timer类实例就会停止运行了。也就是不会调用回调方法了。另外,因为CLR的每个进程中都有许多的线程在运行,你将很难让Timer获得一个线程来执行它,或者能执行它,但会延时。Asp.net层要尽量少的使用这种技术,以减少进程中线程的数量,或者只让请求用一小部分的线程。当然如果你有大量的异步工作的话,那就只能用它了。

  6.使用预请求缓存

  在之前的文章中,我提到过小幅的性能优化有时候非常有用。你只对你的代码作一个小的改到,然后一次调用它一千或一万次。作一次小的性能优化,也许每次请求只能提高一微秒,但是如果每天的请求量很大的话,那么应用程序就有很显著的性能提升。这就是我非常喜欢用预请求缓存来提升程序的性能的原因了。

  虽然Cache API设计成用来保存某段时间的数据,而预请求缓存只是保存某个时期的某个请求的内容。如果某个请求的访问频率高,而且这个请求只需要提取,应用,修改或者更新数据一次。那么就可以预缓存该请求。

  在CS的论坛应用程序中,每一个页面的服务器控件都要求得到用于决定它的皮肤(skin)的自定义的数据,以决定用哪个样式表及其它的一些个性化的东西。这里面的某些数据可能要长时间的保存,有些时间则不然,如控件的skin数据,它只需要应用一次,而后就可以一直使用。

  要实现预请求缓存,用Asp.net 的HttpContext类,HttpContext类的实例在每一个请求中创建,在请求期间的任何地方都可以通过HttpContext.Current属性访问。HttpContext类有一个Items集合属性,在请求期间所有的对象和数据都被添加到这个集合中缓存起来。和你用Cache缓存访问频率高数据一样,你可以用HttpContext.Items缓存那些每个请求都要用到的基础数据。它背后的逻辑很简单:我们向HttpContext.Items中添加一个数据,然后再从它里面读出数据。

     7.利用页面输出缓存和代理服务

  Asp.net是你的界面层,它包含页面,用户控件,服务器控件(HttpHandlers 和HttpModules)以及它们生成的内容。如果你有一个Asp.net页面用来输出html,xml,imgae或者是其它的数据,对每一个请求你都用代码来生成相同的输出内容,你就很有必要考虑用页面输出缓存了。

        希望以上方法会对您有所帮助,谢谢!