.NET程序集大小会影响性能吗?

Bla*_*man 27 .net performance assemblies

.net程序集的大小是否会影响性能?Windows窗体/ Web表单项目中的程序集数量如何?

Dan*_*ard 34

来自Microsoft的模式和实践提高.NET应用程序性能和可伸缩性第5章:

更喜欢单个大型装配而不是多个较小的装配

为了帮助减少应用程序的工作集,您应该更喜欢单个较大的程序集而不是多个较小的程序集.如果您有多个总是一起加载的程序集,则应将它们组合在一起并创建一个程序集.

与多个较小的程序集相关的开销可归结为以下几点:

  • 加载较小程序集的元数据的成本.
  • 触摸CLR中预编译图像中的各种内存页面以加载程序集(如果它是使用Ngen.exe预编译的).
  • JIT编译时间.
  • 安全检查.

因为您只为程序访问的内存页付费,所以较大的程序集为Native Image Generator实用程序(Ngen.exe)提供了更大的机会来优化它生成的本机映像.更好的图像布局意味着可以更加密集地布置必要的数据,这反过来意味着与多个组件中布置的相同代码相比,完成工作所需的整体页面更少.

有时你无法避免分裂组件; 例如,出于版本控制和部署原因.如果需要单独运输类型,则可能需要单独的组件.


Jon*_*eet 11

好吧,每次加载一个程序集时,由于分辨率损失会有一些命中 - 找到正确的文件,可能会验证版本号等.这可能主要是在启动时.

但是,我认为它不会显着影响"稳态"性能.


Ant*_*ean 6

紧凑的框架DLL将始终加载到64 kb的最小内存空间,无论它有多小.因此,加载四个独立的10 kb CF DLL将在设备上花费256 kb.如果你将它们组合在一起(ILMerge),它只会花费你64kb的内存.


Gre*_*g D 5

我从未遇到过可追踪到程序集大小或数量的重大性能损失。我追踪到的绝大多数重大性能问题都是算法缺陷造成的。

正如 Jon Skeet 所说,由于启动时的分辨率,可能会有一些小影响。lassevk 也有一个关于通过反射动态解析程序集的观点。但是,在整个程序过程中,这些都不会超过一次影响性能,并且在正常情况下,除非您在某些非常严格的性能限制下工作,否则可能不会对性能造成重大影响。

也许关于这个问题的一些额外的背景会有所帮助。例如,您问这个问题是因为您有一个包含大量大型程序集的软件,并且您正在尝试加快速度?