变量声明.优化方式

本文关键字:方式 优化 声明 变量 | 更新日期: 2023-09-27 17:59:28

哪种方式更优化,为什么?

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

变量声明.优化方式

第二个可能非常非常稍微慢一点,或者在某些情况下占用更多内存,因为它将有更多的堆栈条目。如果这是重递归方法的一部分,那么这两个变量最终会占用更多的堆栈空间。

不要以此作为支持第一种方法的理由

你应该尽可能编写最干净的代码——如果你能编写代码,使声明后几乎没有变量改变值,那么就可以更容易地以函数式的方式推理代码。

从可读性的角度来看,我通常会支持第二种方法。不过这取决于具体情况。

两者都没有,特别是(省略了对使用两者所做工作的考虑。)

唯一的区别是,在第一种情况下,您基本上覆盖了现有的引用。这两个变量将同时添加到当前范围内的堆栈中(不是必需的),但注意到更多的变量被添加到堆栈性能方面并不是现代机器所关心的问题。

您无法通过这种方式进行优化。

可能会有一些细微的差异,但不确定哪一个会更好,因为这可能会随着系统的不同而变化。这主要取决于运行它的系统,因为它取决于JIT编译器如何优化代码。

第一个选项可能通过重用变量来节省一些堆栈空间,但另一方面,它实际上可能会使用更多的堆栈空间。通过在更多的代码中使用该变量,JIT编译器不太可能将其优化为使用寄存器而不是堆栈空间。

无论哪种方式,差异都很难衡量,因此尝试以这种方式优化代码是不值得的。

你应该使用变量,这样就可以清楚地了解代码的意图。使用单独的变量可能有意义,因为它们引用了单独的对象。

您不应该害怕使用更多的局部变量。只要你没有做一些递归的事情,从而有导致堆栈溢出的风险,那么分配更多的局部变量就不会花费任何代价。由于局部变量是通过简单地移动堆栈指针来分配的,因此实际上根本不需要花费时间来扩大空间。

我总是使用第二个,因为它不太容易出错,即使你复制/粘贴一些部分,然后在第二个块中用新名称替换旧名称,你也会得到更清晰的代码。事实上,只有第二个块允许您访问方法中的myType1 var。

无论如何,这是非常通用的,考虑一下,如果你对这些对象做了很多类似的事情,你可以有一个方法来包装公共部分,并调用该方法两次。

根据经验,永远不要重用变量名。创建一个新的。用一个恰当的名字。表示它与第一个变量不同的名称。

将变量名视为丰富的。不要担心电脑时间。你的时间更宝贵。你会死的。不要担心重复使用变量名。那只是所以1980年代!

我的简单测试对我来说是个新闻:)我初始化了一个对象100000000次,显然创建一个新对象比重新使用旧对象更快: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()
    {
    }
}