.net 程序集的大小是否会影响性能?您的 Windows 窗体/Web 窗体项目中的程序集数量如何?
9 回答
来自微软提高 .NET 应用程序性能和可扩展性的模式和实践第 5 章:
首选单个大型组件而不是多个较小的组件
为了帮助减少应用程序的工作集,您应该更喜欢单个较大的程序集而不是多个较小的程序集。如果您有几个总是一起加载的程序集,则应将它们组合并创建一个程序集。
与拥有多个较小的程序集相关的开销可归因于以下原因:
- 为较小的程序集加载元数据的成本。
- 触摸 CLR 中预编译映像中的各种内存页面以加载程序集(如果它是使用 Ngen.exe 预编译的)。
- JIT 编译时间。
- 安全检查。
由于您只需为程序访问的内存页面付费,因此较大的程序集为本机映像生成器实用程序 (Ngen.exe) 提供了更大的机会来优化其生成的本机映像。更好的图像布局意味着可以更密集地布局必要的数据,这反过来意味着与在多个程序集中布局的相同代码相比,完成这项工作所需的整体页面更少。
有时您无法避免拆分程序集;例如,出于版本控制和部署原因。如果您需要单独运送类型,您可能需要单独的组件。
好吧,每次加载程序集时都会因为分辨率损失而受到一些打击 - 找到正确的文件,可能会验证版本号等。这可能主要是在启动时。
但是,我认为它不会显着影响“稳态”性能。
一个紧凑的框架 DLL 将始终加载到 64 kb 的最小内存空间中,无论它有多小。因此,加载四个单独的 10 kb CF DLL 将在设备上花费 256 kb。如果将它们组合在一起 ( ILMerge ),则只需在设备上花费 64 kb 的内存。
我从来没有遇到过我追踪到的组件大小或数量对性能的重大影响。我发现的绝大多数重大性能问题都是算法缺陷的结果。
正如 Jon Skeet 所说,由于启动时的分辨率,可能会有一些小影响。lassevk 也有关于通过反射对组件进行动态解析的观点。但是,在整个程序过程中,这些都不应该对性能产生一次以上的影响,而且在正常情况下,除非您在一些非常严格的性能限制下工作,否则这可能不会对性能造成重大影响。
也许有关该问题的一些其他上下文会有所帮助。你问这个问题是因为你有一个包含很多大程序集的软件,并且你正在尝试加速它,例如?
我非常怀疑它会在任何可衡量的程度上影响性能。在启动时加载它会有一些惩罚;并且内存使用量可能会增加一到两 MB,但除此之外 - 不会。好吧,除非您自己编写因此而受苦的代码。
也就是说,我还没有看到任何测试,所以我可能是错的。
我知道的一件事会影响性能,与程序集大小有关,至少如果程序集大小与类、方法等的数量有关。
如果您使用反射并为所有程序集使用循环,对于这些程序集中的所有类型,请检查它们是否具有属性等。这可能会 JIT 静态构造函数并在某些情况下调用它们。
啊,看到乔恩的回答,忘记说了。当然,每段代码只会发生一次代码的 JIT,因此,如果您所做的只是反映类型,而不是事后触及它们,则程序集的大小将影响该反射循环的持续时间,但在那之后一点都不重要。
我同意丹的回答,只是添加更多信息:这是另一个支持该观点的相关博客文章:http: //blogs.msdn.com/junfeng/archive/2004/02/23/78139.aspx
不,不影响
未使用的局部变量和不必要的赋值会增加程序集的大小并降低性能。