【问题标题】:.NET Memory Consumption Question.NET 内存消耗问题
【发布时间】:2010-10-28 15:25:57
【问题描述】:

这两种方法中的任何一种是否比另一种使用更多的内存或对 GC 造成更大的负载?

选项#1

LargeObject GetObject()
{
    return new LargeObject();
}

选项#2

LargeObject GetObject()
{
    LargeObject result = new LargeObject();
    return result;
}

【问题讨论】:

    标签: .net memory-management


    【解决方案1】:

    两种方法的堆内存使用量是相等的。在第二种情况下创建局部变量的开销很小,但它不应该打扰你。变量将存储在堆栈中,不会对 GC 造成任何额外压力。此外,这个附加变量可能会被编译器或 JIT 优化(因此它可能不存在于 CLR 实际执行的代码中)。

    【讨论】:

    • 发布模式下生成的代码不太可能有任何差异。 JIT 编译器几乎肯定会删除不必要的临时变量。
    【解决方案2】:

    编译器将生成相当于您的代码版本 2 的 IL,需要一个虚拟堆栈位置来存储对象引用。 JIT 优化器将生成与代码版本 1 等效的机器代码,引用存储在 CPU 寄存器中。

    换句话说,没关系。您在运行时获得完全相同的机器代码。

    【讨论】:

      【解决方案3】:

      您可以查看生成的 IL(使用反射器),看看它是否完全不同。根据编译优化设置,#2 可能会在堆栈上存储一个额外的值(对于 result 值),但这只会是额外的 4 或 8 个字节(如果它是一个类,它应该是!),并且完全不会影响GC。

      【讨论】:

      • IL 不是编译后的代码。这只是一个中间步骤。
      • 是的,但是如果 IL 相同,那么代码将执行完全相同的操作。
      猜你喜欢
      • 2015-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多