“全球可能效率很低”

时间:2011-10-25 11:56:16

标签: performance matlab global-variables

我在if命令中使用(在Matlab中)一个global语句,因此只有在真正需要时才将全局变量导入本地命名空间。

代码分析器警告我“global可能效率非常低,除非它是函数中的顶级语句”。考虑到可能的内部实现,我发现这个限制非常奇怪和不寻常。我正在考虑两种可能性:

  1. 这个警告的真正含义是“global本身效率很低,所以不要在循环中使用它”。特别是在if中使用它,就像我正在做的那样,非常安全,并且警告发出错误(并且措辞不当)

  2. 警告是正确的; Matlab在后台使用了一些非常不寻常的变量加载机制,因此在if语句中导入全局变量要慢得多。在这种情况下,我想要提示或指示这些东西是如何工作的,因为我感兴趣,如果我想在将来编写有效的代码,这似乎很重要。

  3. 这两种解释中哪一项是正确的? (或者两者都不是?)

    提前致谢。

    编辑:更清楚:我知道global很慢(显然我无法避免使用它,因为它是我正在使用的旧库的设计决定);我问的是为什么Matlab代码分析器抱怨

    if(foo==bar)
        GLOBAL baz
        baz=1;
    else
        do_other_stuff;
    end
    

    但不是

    GLOBAL baz
    if(foo==bar)
        baz=1;
    else
        do_other_stuff;
    end
    

    我发现很难想象第一个应该比第二个慢的原因。

4 个答案:

答案 0 :(得分:5)

为了补充eykanals帖子,this技术说明解释了全局为何缓慢的原因。

  

...当函数调用涉及全局变量时,性能更加受到抑制。这是因为要查找全局变量,MATLAB必须将其搜索空间扩展到当前工作空间的外部。此外,涉及全局变量的函数调用看起来比其他变量慢很多的原因是MATLAB Accelerator没有优化这样的函数调用。

答案 1 :(得分:3)

我不知道答案,但我强烈怀疑这与在运行时如何分配和共享内存有关。

尽管如此,我建议阅读Loren和Doug在Mathworks blogs上的以下两个条目:

  1. Writing deployable code,他在该帖子中写的第一件事
  2. Top 10 MATLAB code practices that make me cry,该列表中的#2。
  3. 长话短说,全局变量几乎永远不可能;还有许多其他方法可以实现变量共享 - 其中一些是她讨论过的 - 它们更有效,更不容易出错。

答案 2 :(得分:3)

沃尔特罗伯森在这里的回答 http://mathworks.com/matlabcentral/answers/19316-global-could-be-very-inefficient#answer_25760

  

[...]如果没有在顶级命令中完成,这不一定是更多的工作,但是人们倾向于将构造放在循环中,或者放在条件结构中的多个非排他位置。编写mlint警告的人不必添加澄清就好了,“除非你能证明那些”全局“只会被执行一次,在这种情况下它的效率并不低,但它仍然是不好的形式”

支持我的选项(1)。

答案 3 :(得分:0)

事实(从Matlab 2014到Matlab 2016a,并且不使用parallell工具箱):通常,使用Matlab可以实现的最快代码是通过嵌套函数,在函数之间共享变量而不传递它们。

接近该步骤的步骤是使用全局变量,并将项目拆分为多个文件。这可能会略微降低性能,因为(据说,虽然我从未在任何测试中看到它得到验证)但是Matlab通过从全局工作空间检索而产生开销,并且因为存在某种问题(据说,虽然从未见过任何证据) )使用JIT加速。

通过我自己的测试,在函数调用之间传递非常大的数据矩阵(高分辨率图像),使用嵌套函数或全局变量的性能几乎相同。

使用全局变量或嵌套函数可以获得卓越性能的原因是因为您可以避免以这种方式复制额外的数据。如果您将变量发送到函数,Matlab会通过引用来完成,但如果您修改函数中的变量,Matlab会动态复制(copy-on-write)。除了嵌套函数和全局变量之外,我无法在Matlab中避免这种情况。通过避免这种额外的数据复制(使用更大的数据),可以完全获得从阻碍到JIT或全局获取时间的任何小量消耗。

这可能已经改变了,从来没有版本的Matlab,但从我从朋友那里听到的,我怀疑它。我不能提交任何测试,不再拥有Matlab许可证。

作为证据,不要再看看我在使用Matlab的那天做的toolbox of video processing了。它在引擎盖下是非常丑陋的,因为没有全局效果我无法获得性能。

关于Matlab的这个事实(全局变量是您在需要修改不同函数中的大数据时可以编码的最优化方式),表明语言和/或解释器需要更新。

相反,Matlab可以使用更好,更动态的工作空间概念。但我所看到的一切都表明这种情况永远不会发生。特别是当你看到用户社区看似忽略了事实,并且没有任何基础推进对抗时:比如在Matlab中使用全局变量都很慢。

他们不是。

那就是说,你不应该使用全局变量。如果您被迫在纯Matlab中进行实时视频处理,并且您发现没有其他选择,那么使用全局变量来达到性能,您应该获得提示并更改语言。是时候进入更高性能的语言......也可能偶尔会写一些关于堆栈溢出的咆哮,希望Matlab可以通过摇摆其用户的oppinions来改进。