为什么asp.net网站第一次加载慢asp.net的程序第一次运行是需要编译的,后面再访问时就不需要了,所以第一次比较慢,以后就快了。那么加载的原理是什么呢?

为什么asp.net网站第一次加载慢

       其实在我们第一次向IIS请求ASP.NET网页时,相应的网页就会被编译成DLL文件,然后JIT来运行这个DLL文件,并将运行结果发送给客户端。一旦这个文件再次编辑这个ASP.NET页面后,下次再请求这个网页时又会重新被编译成DLL文件,再由JIT来运行。为了防止发生生成的文件重名的情况,生成的DLL文件采用了随机命名。

      当向服务器发送一个ASP.NET网页的请求时,在内部执行的流程如下:

      ① 检查在服务器内存中是否存在这个网页对应的本地机器代码。

      ② 如果存在,则执行本地机器代码,将运行结果发送到客户端。

      ③ 如果不存在本地机器代码,则检查是否存在这个网页编译后的中间代码(以DLL的形式存在),如果存在,则将中间代码编译成本地机器代码,再执行本地机器代码将结果返回给客户端,并将本地机器代码缓存到内存中。

      ④ 如果不存在对应的中间代码,则将这个网页编译成中间代码,然后将中间代码编译成本地机器代码,将本地机器代码的执行结果发送给客户端,再将本地机器代码缓存到内存中。

      如图所示的是ASP.NET运行时流程图。


      从图中可以看出,如果在服务器没有清理掉内存中缓存的本地机器代码而再次访问同一个页面时,服务器就会直接执行缓存中的本地机器代码,本地机器代码的运行速度是相当快的。即使本地机器代码在内存中由于某些原因被清理掉了(比如服务器重启或者服务器内存不够用时被释放),也仅仅是将中间代码编译成本地机器代码,再次运行本地机器代码将运行结果发送给客户端,然后缓存本地机器代码即可,将中间代码编译成本地机器代码的速度也是很快的。

      这也就是ASP.NET网页不同于其它语言编写的网页的地方:ASP.NET页面在第一次请求时会被编译成DLL文件,再由JIT编译成本地机器代码执行,并且将本地机器代码缓存,如果在缓存没有清空之前再次调用,则会直接执行缓存中的机器代码,即使内存中缓存的机器代码被清空也会再次将中间代码编译成本地机器代码运行并缓存。不过,aspx页面第一次被打开时比较慢,因为存在着先生成中间代码再编译成本地机器代码执行的过程;以后执行时就会比较快了。因为以后执行时要么是直接运行本地机器代码,要么是将中间代码编译成本地机器代码再运行,除非修改了代码;否则就没有必要重新生成中间代码了,并且对于第一次运行时比较慢的情况也可以通过预编译来解决。

标签: