从共享网络文件夹运行的.NET应用程序的性能损失

时间:2011-11-29 12:03:54

标签: .net

从共享网络文件夹运行.NET 4.0应用程序是否有任何性能损失?我发现什么应用程序启动较慢,但没有注意到使用它时有任何减速,但不确定。

2 个答案:

答案 0 :(得分:4)

通过网络运行可执行文件时,Windows在应用程序启动时不会通过网络传输整个应用程序。这样做是为了加快启动时间(如果您从未真正使用它,那么下载700MB嵌入式AVI资源毫无意义。)

这意味着,由于需要来自可执行映像的新页面,Windows将定期返回网络以检索它们。

完成此操作的方法是,如果您的应用程序碰巧遇到不存在的内存页面,将触发标准页面错误,告诉Windows它需要填充该页面。如果此时网络发生故障,Windows将无法满足页面错误。没有办法从中恢复,因此Windows会抛出EXCEPTION_IN_PAGE_ERROR(0xC0000005)。

有三种方法可以解决这个问题:

  • 什么都不做,让应用程序死掉。告诉客户修复他们的网络
  • 捕获错误,解释现在必须终止该应用程序,并告诉用户他们的网络应该受到责备
  • 设置IMAGE_FILE_NET_RUN_FROM_SWAP PE图像选项。这将指示Windows在应用程序加载时通过网络复制整个可执行文件。这将增加网络流量和用户等待时间(在应用程序启动时),但避免错误

答案 1 :(得分:2)

是的,这在Windows中进行了大量优化。加载.NET程序集实际上并不涉及读取程序集。与本机代码非常相似,CLR为程序集文件创建了内存映射文件。一大块虚拟内存,与文件一样大,页面标记为“尚未加载”。

然后,JIT编译器开始阅读IL并为其生成机器代码。不可避免地,它将尝试读取仍处于“尚未加载”状态的内存页面,这将生成低级处理器页面错误。 Windows捕获该错误,然后实际读取文件内容并将其加载到RAM中。抖动继续,好像什么也没发生。

当程序集位于网络共享上时,读取该页面的速度会变慢。但由于抖动仅在实际需要执行程序时编译IL,因此很难注意到这种情况,它只会为每个页面错误添加少量毫秒。当你的程序启动时,它将是最引人注目的,这是在程序可以执行诸如显示其主窗口之类的事情之前需要编译大量IL的唯一实时。