3

如果我有 1000 个 asp.net 网站,每个网站的 /bin 文件夹中有 30 个 DLL。

因此有 30,000 个 DLL。

如果我将一组 DLL 注册到全局程序集缓存中并且每个站点都使用 GAC 中的 DLL,网站/Web 服务器/机器会运行得更快吗?

例如,网站会共同使用更少的内存吗?

4

3 回答 3

7

即使程序集在 GAC 中,它们仍然会从那里单独加载到内存中以提供隔离。换句话说,仅仅因为程序集在 GAC 中并不意味着这些副本在 AppDomains 之间共享。我相信 mscorlib(可能还有一些 BCL 程序集)可以跨 AppDomain 共享,但您或我编写的任何程序集都不会。

然而,这是一件好事:考虑跨 AppDomains 共享的Cache类型的含义。

于 2009-06-03T15:00:43.727 回答
2

实际上,@AndrewHare 接受的答案是不正确的。将程序集放在 GAC 中确实有助于减少内存使用。

Jeffrey Richter(来自与 .NET 团队一起帮助设计 CLR 的 Wintellect)在他的《CLR via C# 》一书中证实了这一点:

将程序集安装到 GAC 中有几个好处。GAC 使许多应用程序能够共享程序集,从而总体上减少物理内存使用量......

Tess Ferrandez 也证实了这一点(来自微软的内存和性能专家 - 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 )。

尽可能强名称并安装到全局程序集缓存 (GAC) 中由多个 ASP.NET 应用程序使用的任何程序集。这将减少内存消耗。

作为示例,我还通过在 x64 WebAPI 服务上进行测试(WinDbg、任务管理器和 ProcExplorer)自己确认了这一点。您会看到 GAC 应用程序的私有工作集较低。在 NGen 的情况下,您会再次看到私有工作集减少。但是,与基线相比,NGen 的应用程序中的页面错误也大大减少(在我的测试中几乎减少了一半)。我发现 GAC 应用程序和非 GAC 应用程序之间的页面错误没有区别。

请注意,在某些情况下,最好的解决方案是通过将 NGen 的程序集安装到 GAC 中来组合 NGen 和 GAC。这优化了共享程序集的应用程序之间的内存使用,并在应用程序启动时提供了性能提升!

于 2018-10-11T21:04:16.543 回答
1

实际上,这会快得多,特别是如果它们也是 NGEN 的。如果 NGEN 没有将它们放在全局程序集缓存中,那么实际上会减慢速度,因为 CLR 需要执行程序集验证以确保它与本机映像匹配。CLR 会跳过对 GAC 程序集的检查,而只会加载和使用本机映像。

NGEN 的程序集也有内存优势,因为它们可以共享代码页。

您还可以考虑尝试优化 DLL 的基地址,因为如果它们都使用默认值,那么 Windows 需要重新设置 30,000 次!

这是一篇关于 NGEN 的性能优势的精彩文章。

http://msdn.microsoft.com/en-us/magazine/cc163610.aspx

于 2009-06-03T15:06:05.493 回答