27

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

4

9 回答 9

34

来自微软提高 .NET 应用程序性能和可扩展性的模式和实践第 5 章:

首选单个大型组件而不是多个较小的组件

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

与拥有多个较小的程序集相关的开销可归因于以下原因:

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

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

有时您无法避免拆分程序集;例如,出于版本控制和部署原因。如果您需要单独运送类型,您可能需要单独的组件。

于 2008-12-03T14:14:09.827 回答
11

好吧,每次加载程序集时都会因为分辨率损失而受到一些打击 - 找到正确的文件,可能会验证版本号等。这可能主要是在启动时。

但是,我认为它不会显着影响“稳态”性能。

于 2008-12-03T13:50:40.187 回答
6

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

于 2008-12-03T14:02:20.913 回答
5

我从来没有遇到过我追踪到的组件大小或数量对性能的重大影响。我发现的绝大多数重大性能问题都是算法缺陷的结果。

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

也许有关该问题的一些其他上下文会有所帮助。你问这个问题是因为你有一个包含很多大程序集的软件,并且你正在尝试加速它,例如?

于 2008-12-03T13:55:52.923 回答
1

我非常怀疑它会在任何可衡量的程度上影响性能。在启动时加载它会有一些惩罚;并且内存使用量可能会增加一到两 MB,但除此之外 - 不会。好吧,除非您自己编写因此而受苦的代码。

也就是说,我还没有看到任何测试,所以我可能是错的。

于 2008-12-03T13:53:48.153 回答
0

我知道的一件事会影响性能,与程序集大小有关,至少如果程序集大小与类、方法等的数量有关。

如果您使用反射并为所有程序集使用循环,对于这些程序集中的所有类型,请检查它们是否具有属性等。这可能会 JIT 静态构造函数并在某些情况下调用它们。

啊,看到乔恩的回答,忘记说了。当然,每段代码只会发生一次代码的 JIT,因此,如果您所做的只是反映类型,而不是事后触及它们,则程序集的大小将影响该反射循环的持续时间,但在那之后一点都不重要。

于 2008-12-03T13:50:10.780 回答
0

我同意丹的回答,只是添加更多信息:这是另一个支持该观点的相关博客文章:http: //blogs.msdn.com/junfeng/archive/2004/02/23/78139.aspx

于 2009-08-10T06:37:33.563 回答
-2

不,不影响

于 2008-12-03T13:55:27.730 回答
-3

未使用的局部变量和不必要的赋值会增加程序集的大小并降低性能。

于 2010-04-12T05:06:22.473 回答