在无限循环中声明变量类型会影响性能吗?

5

根据一些Stack Overflow问题的答案,我读到在循环内部声明对象比在循环外部声明对象性能更好。

我不明白为什么,因为当我在循环内部声明时,我的软件使用的RAM比在循环外部声明时更多。

while (true) {
    String hey = "Hello.";
}

内存使用量:1820kb

String hey;
while (true) {
    hey = "Hello.";
}

内存使用:1720kb

为什么有些人说我应该使用第一种循环方式,因为它的性能更好,但它会多使用100kb内存?


4
我猜你正在使用任务管理器检查内存使用情况。请使用内存分析工具,不要依赖于任务管理器。记得不要改变原文的意思。 - Habib
5
他们这么说是因为你的测量几乎肯定是不正确的 :-) - Sergey Kalinichenko
9
谁说第一个循环性能更好?通常情况下,在尽可能小的范围内声明变量对于可读性更好,但这与性能无关。 - Jon Skeet
4
除了性能部分外,尽可能使用最小范围以减少复杂性并避免错误。 - Tim Schmelter
5
过早优化是万恶之源。除非你分析了代码并发现瓶颈确实在于某个循环,否则不必过度担心它。正如其他人所指出的,编译器是智能的,并会为你自动执行一些简单的优化。因此,请选择易读性和可维护性。 - Matt Burland
显示剩余4条评论
3个回答

6
在.NET的发布模式下运行代码时,由于编译器优化技术循环不变代码移动,这两个代码片段是相同的。JIT优化器中有大量智能优化技术将“修复”您的代码。因此,原则上应该注重代码的可读性/简洁性而不是其他任何东西。

谢谢!我知道这种优化,但我真的不知道它的名字。 - user2819245

5

这两个选项之间完全没有任何区别。它们编译成相同的IL代码。


1
开发者的观点不在考虑范围内,编译器是唯一关心的。如果将声明放在块内,可能会更容易让编译器进行寄存器分配,因为变量的使用范围更加明显。但是,编译器今天很聪明,你不会有太大的区别(请参见@Bas Brekelmans提到的循环不变代码运动)。不能依赖评论中建议的简单测量。如果真的存在确定性差异,我的猜测是编译器在两个版本的某个地方做出了不同的决策,它本来就是启发式的。总之,始终优先考虑可读性而非优化,特别是在这种低级细节上。编译器比你做得更好。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接