大家都知道,网站在第一次启动的时候首先需要对网站进行编译,所以首次访问会有一定的时间消耗。但随着项目功能模块的增加,网站的启动速度越来越慢,甚至到现在需要将近一分钟,令人难以接受,特别是在开发调试下,更是大大降低了开发效率。在百度和谷歌上面搜索过相关的问题,也没有找到答案,大多数人都说这是正常的,甚至有人还怪到MS的头上来。
没办法,只能往MS的编译方向上找了,这时,刚好看到了Artech的《深入剖析ASP.NET的编译原理》,总算找到原因了,编译过程如下:
- Step1:当ASP.NET收到对于某个Page的Request,根据这个request对应的Url试着找到该page对应的Preservation File,如果没有找到,重新编译Page所在目录下的所有需要编译的文件,同时生成一些额外的文件,包括Preservation File。
- Step2:然后解析这个Preservation File,通过hash和filehash判断文件自身或者是Dependent File是否在上一次编译之后进行过任何的修改,如果是的,则重新编译。然后重新执行Step2。
- Step3:通过Preservation File 的assembly attribute Load对应的assembly(如果Assembly还没有被Load的话),通过type获知对应的aspx type,然后借助FastObjectFactory的对应的Create_ASP_XXX创建这个type。这个新创建的对象就是我们需要的Http Handler,在之上执行相应的操作把结果Response到客户端。
网站在首次收到客户端对某个页面的请求,将会对该页面所在目录下所有需要编译的文件进行编译,而刚好我的网站并没有对功能模块进行分目录,也就相当于对整个网站的页面进行一次编译,速度当然难以接受。找到原因自然就好办了,以模块为单位进行分目录。以下是分目录前后首次访问所耗的时间:
未分目录 | 已分目录 | |
第一次 | 33s | 12s |
第二次 | 39s | 9s |
第三次 | 34s | 9s |
从数据上可以看到,效果还是相当的明显,而且数据是在开发模式上做的测试,发布到生产机器上还能进一步减少启动时间。