2

当该程序集的任何方法被调用时,JIT 将程序集加载到内存中,但是如果在该程序集的应用程序中使用了某些方法并且某些方法未使用,那么这些方法是否仍然被加载到内存中?

此外,如果程序集加载到内存中带有许多未使用的函数和方法,是否会影响该应用程序的性能?

4

4 回答 4

4

正如@Dennis 所说,Loading 和 JIT'ing 是 CLR 中两个不同子系统完成的两种不同操作。但他们是依赖的。

您在上下文中有两个问题,要回答它们

  1. JIT 不加载程序集,加载程序会。所有类及其成员的元数据都加载到内存中,但这样的方法仅按需进行 JIT 处理(即在调用它们时)。

  2. JIT 的方法不会在内存中停留很长时间,除非有人引用。CLR 将根据清理程序清理它们。如果以后需要该方法,则加载该方法并再次重新编译(JIT'ed)。因此,在理想情况下,未使用的函数不会影响应用程序的性能。

于 2013-01-22T06:40:34.910 回答
2

不要混淆程序集加载和 JIT 编译。

当使用该程序集中定义的任何类型时,程序集被加载一次(它的使用方式无关紧要- 例如,这可以是公共字段访问);但是当必须执行一种或另一种方法时,JIT 编译(即从 IL 到机器指令的转换)会发生很多次。

程序集加载并不意味着该程序集中的每个方法的 JIT 编译。

于 2013-01-22T06:15:21.440 回答
0

您是否正在寻找加载到 AppDomain 中的程序集的性能计数器?这可能是您在 Windows SDK 中的一个好途径,这组指标有一些性能计数器 - http://msdn.microsoft.com/en-us/library/ekec01h3.aspx

您可以使用上面指定的计数器运行 perfmon 以收集与您拥有的另一个应用程序的一些比较数据,在查看像这样的微优化时,最好有一个基线指标,然后修改和检查性能下降。 运行性能

于 2013-01-22T06:31:24.287 回答
0

根据规范,当第一次使用任何类型的程序集时,CLR 会加载该程序集。我认为没有办法告诉 CLR 只加载程序集的一部分,因此所有类型和方法(使用的或未使用的)都将加载到内存中,尽管编译(JIT-ing)直到类型才会发生(或者可能是方法)正在使用。

出于性能考虑,我可以说这不会影响性能,但会影响内存使用

于 2013-01-22T06:36:44.230 回答