【问题标题】:How a programmers solve the dilemma of using old variables instead of new variables?程序员如何解决使用旧变量而不是新变量的困境?
【发布时间】:2013-05-11 15:15:51
【问题描述】:

例如:

...一些代码

int sizeOfSomeObject = someObject.length();

...一些代码,sizeOfSomeObject 不再需要了

现在我需要其他 int 变量来执行其他操作(例如,用于某个对象中的位置),而我遇到了两难境地:为此创建一个新变量或使用 sizeOfSomeObject。在第一种情况下,我将保持可读性,但会失去性能。在第二种情况下 - 相反。程序员在这种情况下通常会怎么做?

【问题讨论】:

  • 是什么让你认为你会失去性能?在这种情况下,您的编译器几乎肯定足够聪明,可以“做正确的事”。

标签: optimization coding-style


【解决方案1】:

在第一种情况下,我将保持可读性,但会降低性能。在第二种情况下 - 恰恰相反。

那么你对它进行了基准测试吗?我怀疑不,你没有。大多数现代编译器在寄存器分配期间会进行大量主动分析,因此如果优化器感知到有一个不再使用的变量,但是有一个相同类型的新变量,它会将这两个变量合并到同一个内存区域或处理器寄存器。无需担心性能损失。


无论如何,不​​要进行过早的优化(就是这样)。在 90% 的情况下,可读性比“性能”更重要。

总而言之,继续创建一个具有适当的、不同的描述性名称的新变量。只是为了好玩,编译这个版本和您使用相同变量名的版本,并查看生成的程序集(或字节码,或...) - 并发现它们相同。强>

【讨论】:

    【解决方案2】:

    我会为不同的事物使用不同的命名变量。

    就这样的事情而言,我不认为只有一个变量会导致巨大的性能损失。在大多数语言中,您可以选择在不再使用时以某种方式从内存中清除变量,因此我建议您这样做,以便代码在以后阅读时对您或其他人有意义。

    【讨论】:

      【解决方案3】:

      在 C++ 中,您可以使用块来销毁不再需要的对象:

      void some_function () {
         {
            MyClass c;
            // ... here we use c ...
         }
         // now c has been destroyed
         {
            MyClass d;
            // ... here we use d ...
         }
         // now d has been destroyed
      }
      

      在您的示例中(使用int 变量),没有理由担心性能。可能发生的最糟糕的事情是使用两个变量而不是一个变量的内存,但是(i)这可以忽略不计,并且(ii)int's 可能会存在于 CPU 寄存器中,无论如何。如果您真的担心,请在 int 示例中使用块方法。

      【讨论】:

        【解决方案4】:

        这取决于初始化这种 int 的频率。如果它不在一些非常嵌套的 for 循环中,大多数(所有)程序员都会选择第一个。此外,大多数现代编程语言都有一个垃圾收集器,可以清理剩余的对象。

        【讨论】:

        • “如果它不在一些非常嵌套的 for 循环中” - 请注意,今天的编译器已经足够聪明,可以将循环变量移出循环,因此不会在每次迭代时进行分配。
        • 不客气。一个小细节,可以带来一些大好处,值得了解。
        【解决方案5】:

        体面的编译器会优化你的第二个变量,所以这应该不是问题。

        也就是说,在某些情况下变量重用是有意义的。例如,您可能有一些变量保存从调用某些外部 API 填充的通用输出。根据传递给 API 的上下文和参数,您将以不同的方式处理数据,但重用相同的数据变量可能会更好(更具可读性等)。

        例如,像这样的:

        void* data = getSomeData(params);
        //process data
        //change params
        data = getSomeData(params);
        //process data
        //change params
        data = getSomeData(params);
        

        【讨论】:

          猜你喜欢
          • 2021-09-03
          • 1970-01-01
          • 2022-12-05
          • 2020-12-17
          • 2019-06-21
          • 1970-01-01
          • 2022-11-10
          • 2018-01-20
          • 1970-01-01
          相关资源
          最近更新 更多