我有一个部署到 IIS 的 ASP.NET(非 MVC)站点。我已经设置了预编译选项(用于部署/发布)。设置如下图所示。我尝试了下面设置的各种变化,从表面上看,这样做并没有带来任何显著的改进。为了测试,我将预编译和非预编译的站点部署到两个不同的 IIS 站点。我进入并回收每个站点的应用程序池(或重置 IIS)... 完成此操作后,我分别访问了两个站点,它们都花费了同样长的时间来呈现第一个页面加载(即缓存应用程序池?),然后对其他 aspx 页面的后续调用大约花费相同的时间(预编译和非预编译)。我遗漏了什么吗?预编译只适用于大型站点吗?我有一个中型站点,有 API 调用、DB 调用等。
我需要进行哪些特定设置来缩短应用程序池回收后网站首次点击的加载时间?或者一般来说,缩短尚未编译的 aspx 或 ascx 的首次点击响应时间?
答案1
“预编译”和“未预编译”之间的区别在于,“未预编译”的网站页面将在 .net 编译器(csc.exe/vbc.exe,您实际上可以在任务管理器的进程选项卡中看到它们弹出)首次请求每个页面时进行动态编译。因此,每个页面将占用一次编译时间,尽管通常可以忽略不计。如果您的网站在 /app_code 目录中也有代码文件,这些文件也会在网站启动之前进行编译,因此初始启动应该比“预编译”版本稍慢。也就是说,如果您的“非预编译”网站的 web.config 中的编译元素将“batch”属性设置为 false,否则它将花时间在启动时编译所有页面,这可能需要很长时间,具体取决于您网站的大小。编译元素(ASP.NET 设置架构)
/app_code 文件和(例如)default.aspx 在“未预编译”的站点中编译之后,两者之间的实际性能不会有差异。
IIS 重置或应用程序池回收也不会显示任何差异,因为在部署一个并运行两个站点后,两个站点都经过编译。IIS 重置/应用程序池重置不会导致“未预编译”站点重新编译,只有更改文件/重新部署才会。
看一看了解 ASP.NET 动态编译,了解其作用对于比较两者非常重要。