Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/matlab/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance &引用;“全球化可能会非常低效”;_Performance_Matlab_Global Variables - Fatal编程技术网

Performance &引用;“全球化可能会非常低效”;

Performance &引用;“全球化可能会非常低效”;,performance,matlab,global-variables,Performance,Matlab,Global Variables,我(在Matlab中)在if命令中使用了一个global语句,因此,只有在确实需要全局变量时,我才会将其导入本地名称空间 代码分析器警告我,“global可能非常低效,除非它是其函数中的顶级语句”。考虑到可能的内部实现,我发现这个限制非常奇怪和不寻常。我在考虑两种可能性: 这个警告真正的意思是“global本身效率很低,所以不要在循环中使用它”。特别是,在if中使用它,就像我正在做的那样,是完全安全的,并且警告是错误的(而且措辞糟糕) 警告是正确的;Matlab在后台使用了一些非常不寻常的变量加

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

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

  • 这个警告真正的意思是“
    global
    本身效率很低,所以不要在循环中使用它”。特别是,在if中使用它,就像我正在做的那样,是完全安全的,并且警告是错误的(而且措辞糟糕)

  • 警告是正确的;Matlab在后台使用了一些非常不寻常的变量加载机制,因此在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