【问题标题】:Is there performance gain or another reason for declaring all local variables before?之前声明所有局部变量是否有性能提升或其他原因?
【发布时间】:2015-04-22 21:00:45
【问题描述】:

我在我们的代码库和网上也经常看到这种风格,如果你有一个带有 for 循环和 if 语句的函数,那么只有它们使用的所有变量都不会在它们之外声明。例如:

void process()
{
    int i;
    int count = 100;
    vector3 point;
    vector sum;

    for (i = 0; i < count; ++i)
    {
        import(this, "pos", point);
        sum += point;
    }
    sum /= count;
}

或者这是过早的优化?我对 C++、C# 和 Python 很好奇,这些语言是我使用的语言,我在哪里一遍又一遍地看到这些。

【问题讨论】:

  • 我非常熟悉 Python(以及来自 Maya 的 MEL),但在我看来,这些变量声明是因为 if/for 语句在某些语言中有自己的范围规则(不是很明显,Python)。如果您没有在它们之外声明变量,那么您在这些语句中所做的任何变量分配都不能在函数的后面进一步重复使用。任何人,如果我错了,请随时纠正我。
  • 听起来像是继承自 C89 的风格,所有变量都必须在开头声明。
  • 我冒昧地猜测可能是准确地说,因为函数可能会发生变化。以这样一种方式声明变量是有意义的,以便以后扩展功能很容易。有点像某些设计模式在您达到一定程度的复杂性之前不会立即有用。我认为在这种情况下将变量声明放在开头只是一个好习惯。而如果不这样做,则每次调整功能时都需要不断地进行修复。

标签: c# python c++ performance optimization


【解决方案1】:

没有区别。无论哪种方式,它都在堆栈上。

【讨论】:

  • 它在优化方面有所不同。一点点,但它是不同的。
  • @Christian:你有证据证明这个说法吗?
【解决方案2】:

很多旧代码都这样做是因为它在 C89/90 中是必需的。好吧,从技术上讲,从来没有要求在函数的开头定义变量,只需要在 block 的开头。例如:

int f() { 
    int x;   // allowed

    x = 1;
    int y;   // allowed in C++, but not C89

    {
       int z=0;    // beginning of new block, so allowed even in C89

       // code that uses `z` here
    }
}

C++ 从来没有这个限制(C 也有很长一段时间没有),但是对于一些旧习惯来说很难改掉。对于其他人来说,保持整个代码库的一致性比定义变量接近使用位置的好处更重要。

就优化而言,这些通常都不会产生任何影响。

【讨论】:

    【解决方案3】:

    它在 python 中有所不同。这是一个作用域问题,python 将首先搜索包含局部变量的字典,然后向上工作到全局,然后是内置的。

    在 python 中这有轻微的速度提升,虽然通常不是很多。检查THIS问题以查看有关python的更多详细信息,包括一些测试。

    我无法评论 C++ 或 C#,但因为它们是编译语言,所以这并不重要。

    【讨论】:

    • 类似的事情发生在 C++ 中。有块 {} 分隔范围
    • 真的,我觉得这有点奇怪。我认为编译器可能会在可能的情况下优化和引用局部变量,如果不需要,任务不会落在 CLR 上。让我感兴趣,有一个很好的链接吗?
    • 在 python 中,iffor 块没有自己的范围,因此完全没有必要在循环外声明变量,即使可以这样做。局部和全局的区别与局部和外部局部的区别不同,但在所有情况下严格局部都会获胜,这与OP中问题的假设相反。
    • @rici OP 清楚地展示了一个函数,虽然我可以在一定程度上同意你的看法,但你忘记了 python 有各种实现。 PyPy 甚至表明,由于 JIT,在函数中运行一个简单的循环比运行一个循环更快。我认为 Cython 也有同样的表现。更不用说因为if __name__ == __main__: main()“hack”今天经常使用,这种情况经常发生。因此,我坚持认为我的回答是在 OP 的大方向上。但是我同意你的观点,这不是一个普遍的规则。从来没有优化过。
    猜你喜欢
    • 1970-01-01
    • 2013-07-15
    • 1970-01-01
    • 2019-05-21
    • 2023-03-22
    • 2021-08-09
    相关资源
    最近更新 更多