如果我有一个1000个asp.net网站,每个网站的/ bin文件夹中有30个DLL。
因此有30,000个DLL。
如果我将一组DLL注册到全局程序集缓存中并且每个站点都使用GAC中的DLL,那么网站/ Web服务器/机器会运行得更快吗?
e.g。网站会集体使用更少的内存吗?
答案 0 :(得分:7)
即使程序集在GAC中,它们仍然会从那里单独加载到内存中以提供隔离。换句话说,仅仅因为程序集在GAC中并不意味着这些副本在AppDomains之间共享。我相信mscorlib(可能还有一些BCL程序集)可以在AppDomains上共享,但是你或我写的任何程序集都不会。
但这是一件好事:考虑在AppDomains中共享Cache类型的含义。
答案 1 :(得分:1)
实际上这会更快,特别是如果它们也是NGEN的话。如果您没有将它们放入全局程序集缓存中,那么您实际上会减慢速度,因为CLR需要执行程序集的验证以确保它与本机映像匹配。 CLR会跳过此检查以获取GAC程序集,只需加载并使用本机映像。
NGEN程序集也有内存优势,因为它们可以共享代码页。
你也可以考虑尝试优化DLL的基地址,因为如果它们都使用默认值,那么Windows需要重新设置30,000次!
这是关于NGEN性能优势的精彩文章。
答案 2 :(得分:0)
实际上,@ AndrewHare接受的答案不正确。在GAC DOES 中放置程序集有助于减少内存使用。
Jeffrey Richter(来自Wintellect和.NET团队一起设计CLR的作者)在他的书CLR via C#中证实了这一点:
将程序集安装到GAC中有许多好处。 GAC使许多应用程序可以共享程序集,从而总体上减少了物理内存的使用 ....
Tess Ferrandez(Microsoft的https://blogs.msdn.microsoft.com/tess/2006/04/12/asp-net-memory-you-use-the-same-dll-in-multiple-applications-is-it-really-necessary-to-load-it-multiple-times的内存和性能专家)也对此进行了确认。
尽可能使用强名称,并将一个以上ASP.NET应用程序使用的所有程序集安装到全局程序集缓存(GAC)。 这将减少内存消耗。
我还通过在x64 WebAPI服务上进行测试(WinDbg,任务管理器和ProcExplorer)来证实了这一点。您会发现,GAC的应用程序的私有工作集更低。对于NGen,您会再次看到私有工作集减少了。但是,与基线相比,NGen'd应用程序中的页面错误也大大减少了(在我的测试中几乎减少了一半)。我发现GAC应用程序和非GAC应用程序在Page Faults上没有区别。
请注意,在某些情况下,最好的解决方案是通过将NGen的程序集安装到GAC中来结合NGen和GAC。这样可以优化共享程序集的应用程序之间的内存使用,并在应用程序启动时提高性能!