C# 在无限循环中声明变量类型性能?

C# 在无限循环中声明变量类型性能?,c#,performance,scope,C#,Performance,Scope,根据一些堆栈溢出问题的答案,我已经读到在循环内使用对象声明比在循环外使用要好,性能方面 我不明白为什么,因为当我在循环内使用声明时,我的软件比在循环外使用声明的软件使用更多的RAM while (true) { String hey = "Hello."; } 内存使用:1820kb String hey; while (true) { hey = "Hello."; } 内存使用:1720kb 为什么人们说我应该使用第一个循环,因为它的性能更好,但它从ram中多使用了100

根据一些堆栈溢出问题的答案,我已经读到在循环内使用对象声明比在循环外使用要好,性能方面

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

while (true) {
    String hey = "Hello.";
}
内存使用:1820kb

String hey;
while (true) {
    hey = "Hello.";
}
内存使用:1720kb


为什么人们说我应该使用第一个循环,因为它的性能更好,但它从ram中多使用了100kb?

当在.NET的发行模式下运行代码时,这两段代码是相同的,因为编译器优化技术称为。JIT优化器中有大量智能优化技术可以“修复”代码。因此,原则上,您应该支持代码的可读性/简单性,而不是其他任何东西。

这两个选项之间绝对没有区别。它们被编译成相同的IL代码。

撇开开发人员的观点不谈,编译器是唯一关心的人。如果将声明放在块中,可能会使编译器更容易使用注册表分配,因为变量的使用范围更为明显。但是,今天的编译器很聪明,你不会有太大的不同(参见@Bas Brekelmans提到的循环不变代码运动)

您不能依赖评论中建议的简单度量。如果RAM使用之间确实存在确定性差异,我的猜测是编译器对这两个版本做出了不同的决定,不管怎样,它都是启发式工作的


总而言之,总是喜欢可读性而不是优化,尤其是对于这样低级的细节。编译器在这方面比您做得更好。

我想您是在用任务管理器检查内存使用情况,使用任务管理器,不要依赖任务管理器。他们这样说是因为您的测量几乎肯定是不正确的:-)谁说第一个循环对性能更好?通常,在尽可能小的范围内声明变量的可读性更好,但这与性能无关。除了性能部分外,始终使用尽可能小的范围来降低复杂性和避免严重错误。过早优化是万恶之源。不要担心这个问题,除非你对你的代码进行概要分析,并找到有问题的循环才是真正的问题所在。正如其他人所指出的,编译器是智能的,不管怎样,它都会自动为您执行类似这样的简单优化。因此,请使用可读和可维护的内容。谢谢!我知道这种优化,但我真的不知道它的名字。