2016-07-28 44 views
0

我一直在学习堆栈和堆,特别是使用LIFO方法的堆栈。我是否应该使用嵌套块来提高性能

这是否可以在方法中使用嵌套块并且可以用来提高性能

public void Test() { 
    int i = 5; 
    // do something with i 

    int j = 5; 
    // do something with j 
} 

在这个例子中,只有在方法结束时,我和j才能从栈中被释放。

以下会更有效吗? (我知道它是一个简单的程序.....),或者释放的努力会更多地保存在堆栈的大小上吗?

public void Test() { 
    { 
     int i = 5; 
     // do something with i 
    } 
    { 
     int j = 5; 
     // do something with j 
    } 
} 

这仅仅是为了举例的目的,我知道我可以重构这个等我只对发生了什么记忆的方法感兴趣....

回答

5

堆栈分配为全该方法调用无论如何。

一些微妙的情况下,增加额外的模块可以帮助,在拍摄的变量而言 - 如果你有两个lambda表达式,其中一个捕获i并捕获j其中之一,那么在你的第一个情况下,你” d最终得到一个能够捕获这两个变量的综合类,而在第二种情况下,最终会有两个类......至少在当前的实现中。

没有变量捕获,至少可能 JIT可能会注意到,您一次只能使用一个变量,并且优化以重新使用相同的堆栈空间。

这是非常罕见的,微观优化像这样的有显著的性能影响,但他们可以有一个非常显著可读性的影响......所以我只能开始做你的代码的可读性时:

  • 你有
  • 你缩小了在地方强大的性能测试
  • 你心里有一个具体的绩效目标(让你知道当你完成),其中的瓶颈是
  • 你甲肝È证明,在可读性的减少提供了在性能
0

一个显著升压假设发布版本/配置,编译器(可能JIT编译器,而不是C#之一)应该能够确定该变量的生存期不重叠,所以(如果它选择这样做的话)编译器可以为两者重用相同的位置(实际上可能是一个寄存器而不是任何特定的堆栈空间)。如果这些是参考文献,而是仍然假设发布,那么您的假设也不适用 - JIT和GC协作以了解变量生存期,因此可以收集对象,而引用它的变量仍然是“在范围内”,前提是该变量实际上不是再次读取。

相关问题