C# 几个.NET类库对应用程序启动时间的影响

C# 几个.NET类库对应用程序启动时间的影响,c#,.net,visual-studio,C#,.net,Visual Studio,类库的数量对.NET应用程序的启动时间有多大影响 我的意思是,一个.NET项目有100个类库,而一个项目有10个类库,在这两种情况下,这些类库中都有相同的源代码。 可能的场景:将独立的功能拆分为独立的类库(所有层-逻辑、数据库等),而不是子文件夹(出于清晰和依赖关系管理的原因) 拥有大量类库对.NET应用程序的启动时间有任何已知影响吗?如果可能,.NET是否并行加载类库 更多的装配信息等会带来一些开销,这一点很明显,但这是否足以在启动时对其进行测量?我认为这是早期的微观优化。这种开销在大多数情况

类库的数量对.NET应用程序的启动时间有多大影响

我的意思是,一个.NET项目有100个类库,而一个项目有10个类库,在这两种情况下,这些类库中都有相同的源代码。
可能的场景:将独立的功能拆分为独立的类库(所有层-逻辑、数据库等),而不是子文件夹(出于清晰和依赖关系管理的原因)

拥有大量类库对.NET应用程序的启动时间有任何已知影响吗?如果可能,.NET是否并行加载类库


更多的装配信息等会带来一些开销,这一点很明显,但这是否足以在启动时对其进行测量?

我认为这是早期的微观优化。这种开销在大多数情况下是微不足道的

如果您现在在性能方面没有问题,那么不要介意,只要使用任何使您的体系结构更加清晰、透明、便于开发人员使用的方法即可

当您有一天偶然发现性能问题和应用程序启动缓慢时,您将开始诊断原因并对不同的方法进行基准测试,以提高性能,包括减少程序集数量、动态程序集加载等。此基准测试将精确显示这些技术是否值得

一个重要的注意事项是:大量的程序集会影响构建时间,从而减慢开发和CI进程

要添加到的答案中,应用程序所需的程序集数量不一定会直接降低应用程序的启动速度。原因有点复杂,但本质上是.NET,JIT(实时)编译器只加载执行当前代码分支所需的程序集

如果为了执行一个方法,而且是第一次遇到它,JIT将扫描IL块,引入任何其他需要的引用,并将其完全编译为本机代码来执行。一旦这样做了,那么该方法就不需要再次重新编译,它将加载到任何引用的程序集中——假设它一开始不在那里

例如,如果你开始的代码很简单

public static void Main(string[] args)
{
    Console.WriteLine("Something");
}
然后,在执行
Main
时,此时加载的程序集/命名空间仅为
System
命名空间的程序集/命名空间

如果您添加了代码以调用另一个程序集,那么

public static void Main(string[] args)
{
    // only the core .NET assemblies loaded so far...
    Console.WriteLine("Something");

    // call a method using another assembly's components/objects...
    CallToAnotherAssembly();
}

private static void CallToAnotherAssembly()
{
    // in order for the JIT to execute this, it needs to load the
    // other assembly into memory and create the object. NOW it's
    // in memory and affecting your startup
    var objectInAnotherAssembly = new ObjectInAnotherAssembly();
}
在调试中,您可以通过在不同点调用
Assembly.getExecutionGassembly().GetLoadedModules()
来测试行为,以查看在该点加载和未加载的内容


如果应用程序在启动时只使用少量方法,则不一定在该时间点加载其他程序集。如果在点击按钮等之后使用其他组件,那么这些模块在第一次被点击时就会被加载。

谢谢!我认为,如果VisualStudio真的只构建更改的项目和依赖项(据我所知,它应该做什么),那么开发过程不应该受到太大的影响。不管怎样,我会试试。答案已经显示出不同的方面。需要指出的一点是,在部署之前,始终可以使用ILMerge或ILRepack合并程序集。您还可以通过合并它们来测试轻松获得的性能。将代码库拆分为几个有意义的程序集是一种最佳实践(但不要太多,因为这会导致另一个极端)。重新启动计算机并启动程序。如果启动它似乎需要异常长的时间,几秒钟,但不是第二次启动,那么你就会知道是什么导致了它。