哪种更优化的方式和原因?
MyType myType1 = new MyType();
// Do some work with myType1
myType1 = new MyType();
// Do some work with myType1
或
MyType myType1 = new MyType();
// Do some work with myType1
MyType myType2 = new MyType();
// Do some work with myType2
答案 0 :(得分:12)
第二个可能非常非常稍慢或者在某些情况下需要更多内存,因为它会有一个堆栈条目。如果这是一个重度递归方法的一部分,你最终会为这两个变量占用更多的堆栈空间。
不要将此作为支持第一种方法的理由。
您应该编写最干净的代码 - 如果您可以编写代码,以便在声明后几乎没有任何变量更改值,这样可以更容易地以函数样式推理您的代码。
从可读性的角度来看,我通常赞成第二种方法。这取决于具体情况。
答案 1 :(得分:3)
两者都没有,特别是(省略对任何一项工作的考虑。)
唯一的区别是你在第一种情况下基本上覆盖了现有的引用。这两个变量将在当前范围内同时添加到堆栈中(不是必需的) - 但是要注意更多的变量被添加到堆栈中,性能方面并不是现代机器所关注的问题。
答案 2 :(得分:2)
没有优化可以这样做。
可能存在细微差别,并且不确定哪一个更好,因为这可能会从一个系统变为另一个系统。它主要取决于您运行它的系统,因为它取决于JIT编译器如何优化代码。
第一个选项可能通过重用变量来节省一些堆栈空间,但另一方面它可能实际上使用了更多的堆栈空间。通过在更多代码中使用变量,JIT编译器不太可能优化它以使用寄存器而不是堆栈空间。
无论哪种方式都难以衡量差异,因此尝试以这种方式优化代码甚至都不值得。
您应该使用变量,以便清楚代码的用意是什么。使用单独的变量可能有一点,因为它们引用了单独的对象。
你不应该害怕使用更多的局部变量。只要你没有做一些递归的东西,这样你就有可能导致堆栈溢出,分配更多的局部变量并不需要任何费用。由于局部变量是通过简单地移动堆栈指针来分配的,因此它实际上没有时间来使该空间更大。
答案 3 :(得分:1)
我总是会使用第二种,因为它不易出错,即使您复制/粘贴某些部分,然后在第二个块中用新的名称替换旧名称,您最终会得到更清晰的代码。实际上只有第二个块允许你在方法中访问myType1 var。
无论如何这是非常通用的,考虑如果你用这些对象做很多类似的事情,你可以有一个方法来包装公共部分并调用方法两次。
答案 4 :(得分:1)
根据经验,不要重复使用变量名。创建一个新的。用一个合适的名字。一个名称,表示它与第一个变量不同。
将变量名称视为丰富。不要担心电脑时间。你的时间更宝贵。你会死的。不要担心重用变量名称。那只是所以 1980年代!
答案 5 :(得分:1)
我的简单测试对我来说是新闻:) 我初始化一个对象100,000,000次,创建一个新对象显然更快,而不是重新使用旧对象:O
string output = "";
{
DateTime startTime1 = DateTime.Now;
myclass cls = new myclass();
for (int i = 0; i < 100000000; i++)
{
cls = new myclass();
cls.var1 = 1;
}
TimeSpan span1 = DateTime.Now - startTime1;
output += span1.ToString();
}
{
DateTime startTime2 = DateTime.Now;
for (int i = 0; i < 100000000; i++)
{
myclass cls = new myclass();
cls.var1 = 1;
}
TimeSpan span2 = DateTime.Now - startTime2;
output += Environment.NewLine + span2.ToString() ;
}
//Span1 took 00:00:02.0391166
//Span2 took 00:00:01.9331106
public class myclass
{
public int var1 = 0;
public myclass()
{
}
}