Performance &引用;“全球化可能会非常低效”;
我(在Matlab中)在if命令中使用了一个Performance &引用;“全球化可能会非常低效”;,performance,matlab,global-variables,Performance,Matlab,Global Variables,我(在Matlab中)在if命令中使用了一个global语句,因此,只有在确实需要全局变量时,我才会将其导入本地名称空间 代码分析器警告我,“global可能非常低效,除非它是其函数中的顶级语句”。考虑到可能的内部实现,我发现这个限制非常奇怪和不寻常。我在考虑两种可能性: 这个警告真正的意思是“global本身效率很低,所以不要在循环中使用它”。特别是,在if中使用它,就像我正在做的那样,是完全安全的,并且警告是错误的(而且措辞糟糕) 警告是正确的;Matlab在后台使用了一些非常不寻常的变量加
global
语句,因此,只有在确实需要全局变量时,我才会将其导入本地名称空间
代码分析器警告我,“global
可能非常低效,除非它是其函数中的顶级语句”。考虑到可能的内部实现,我发现这个限制非常奇怪和不寻常。我在考虑两种可能性:
global
本身效率很低,所以不要在循环中使用它”。特别是,在if中使用它,就像我正在做的那样,是完全安全的,并且警告是错误的(而且措辞糟糕)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
我发现很难想象为什么第一个比第二个慢。我不知道答案,但我强烈怀疑这与运行时如何分配和共享内存有关 尽管如此,我还是建议读一下Loren和Doug的两篇文章:
长话短说,全局变量几乎从来都不是我们要走的路;还有许多其他方法可以实现变量共享,其中一些是她讨论过的,这些方法效率更高,也更不容易出错。为了补充eykanals的文章,《技术说明》解释了为什么global很慢 。。。当函数调用涉及全局变量时,性能会受到更大的抑制。这是因为为了寻找全局变量,MATLAB必须将其搜索空间扩展到当前工作空间的外部。此外,涉及全局变量的函数调用比其他函数调用慢得多的原因是MATLAB Accelerator没有优化此类函数调用
沃尔特·罗伯森的回答 […]如果不是在顶级命令中完成,这不一定是更多的工作,但是人们倾向于将构造放在循环中,或者放在条件结构中的多个非独占位置。对于编写MLIT警告的人来说,不必添加诸如“除非你能证明那些“全局”只执行一次,否则执行一次”之类的澄清就容易多了,在这种情况下,它的效率并没有降低,但形式仍然不好 支持我的选项(1)。事实(从Matlab 2014到Matlab 2016a,不使用Parallel工具箱):通常,使用Matlab可以实现的最快代码是通过执行嵌套函数,在函数之间共享变量而不传递它们 接近这一点的步骤是使用全局变量,并将项目拆分为多个文件。这可能会略微降低性能,因为(据推测,尽管我从未见过它在任何测试中得到验证)Matlab从全局工作区检索会产生开销,而且因为JIT加速存在某种问题(据推测,尽管从未见过任何证据) 通过我自己的测试,使用嵌套函数或全局变量在函数调用之间传递非常大的数据矩阵(高分辨率图像)在性能上几乎相同 使用全局变量或嵌套函数可以获得优异性能的原因是,可以避免以这种方式复制额外的数据。如果向函数发送变量,Matlab会通过引用执行此操作,但如果修改函数中的变量,Matlab会动态复制(写时复制)。据我所知,在Matlab中,除了通过嵌套函数和全局变量,无法避免这种情况。从阻碍到JIT或全局获取时间的任何小消耗都是通过避免这种额外的数据复制(当使用较大的数据时)而获得的 这可能已经改变了从未版本的Matlab,但从我从朋友那里听到的,我怀疑它。我不能提交任何测试,没有Matlab许可证了 作为证明,请不要再看我在使用Matlab时所做的。这是可怕的丑陋的引擎盖下,因为我没有办法得到性能没有环球 关于Matlab的这一事实(当您需要修改不同函数中的大数据时,全局变量是您可以编码的最优化的方式),表明需要更新语言和/或解释器 相反,Matlab可以使用更好、更动态的工作空间概念。但我所看到的一切都表明这种情况永远不会发生。尤其是当你看到用户群体似乎忽视了事实,并在没有任何基础的情况下提出质疑:比如在Matlab中使用globals是很慢的 事实并非如此
也就是说,你永远不应该使用globals。如果您被迫在纯Matlab中进行实时视频处理,并且发现您没有其他选择,那么使用globals来达到性能,您应该得到提示并更改语言。是时候学习更高性能的语言了。。。。也可能偶尔写一篇关于堆栈溢出的文章,希望Matlab能通过改变用户的意见来改进。谢谢分享,但全局变量是我使用的库(LYAPACK)的一个选择,所以我不能更改它。@Jonas-你知道,我甚至都懒得看那个p