未使用的函数/汇编方法是否已加载到内存中?

时间:2013-01-22 06:07:40

标签: c# .net performance optimization

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

此外,如果使用大量未使用的函数和方法加载到内存中的程序集会影响该应用程序的性能吗?

4 个答案:

答案 0 :(得分:4)

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

你有两个问题需要回答它们

  1. JIT不加载程序集,加载程序会加载程序集。所有类及其成员的元数据都加载到内存中,但这样的方法只是按需JIT(意味着,当它们被调用时)。

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

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

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

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