Performance Matlab:局部函数(子函数)是与主函数一起编译还是单独编译?

Performance Matlab:局部函数(子函数)是与主函数一起编译还是单独编译?,performance,matlab,optimization,compiler-optimization,Performance,Matlab,Optimization,Compiler Optimization,我听说MATLAB有一个自动的函数编译功能,如果您多次调用函数,如以下代码所示,可能会产生大量函数调用开销: function output = BigFunction( args ) for i = 1:10000000 SmallFunction( args ); end end 如果将函数SmallFunction()作为本地函数放在与BigFunction()相同的文件中,调用该函数会更快吗?或者除了将SmallFunction()中的代码粘贴到BigF

我听说MATLAB有一个自动的函数编译功能,如果您多次调用函数,如以下代码所示,可能会产生大量函数调用开销:

function output = BigFunction( args )
    for i = 1:10000000
        SmallFunction( args );
    end
end
如果将函数
SmallFunction()
作为本地函数放在与
BigFunction()
相同的文件中,调用该函数会更快吗?或者除了将
SmallFunction()
中的代码粘贴到
BigFunction()
中以优化性能之外,还有什么好的解决方案吗


Edit:假设函数调用开销是由于需要编译造成的,这可能是错误的。问题是如何在不让代码看起来糟糕的情况下减少开销。

Matlab将读取的函数散列到内存中。如果函数作为独立函数存在于自己的文件中,则只编译一次。如果将
BigFunction
放在
BigFunction.m
中,并将
SmallFunction
放在
SmallFunction.m
中,那么您应该会获得一次编译m脚本的优化好处。

我的第一个问题的答案是,本地函数与另一个文件中的函数执行相同的操作

第二个问题的一个想法是,如果可能的话,将
SmallFunction()
作为一个内联函数,这样可以减少函数调用开销。我在中找到了有关函数调用性能的更多信息,并将问题和答案粘贴到下面:

问题:

我有7种不同类型的函数调用:

  • 内联函数。函数的主体是目录写入(内联)

  • 函数在单独的MATLAB文件中定义。参数由调用函数传递(文件传递)

  • 函数在单独的MATLAB文件中定义。参数通过引用全局变量提供;调用函数(文件全局)只提供索引

  • 嵌套函数。参数由封闭函数传递(嵌套传递)

  • 嵌套函数。参数是与封闭函数共享的参数;封闭函数(嵌套共享)只提供索引

  • 子功能。参数由调用函数传递(子传递)

  • 子功能。参数通过引用全局变量提供;调用函数(子全局)只提供索引

  • 我想知道哪个函数调用通常比其他函数调用提供更好的性能

    MathWorks支持团队的答案粘贴在此处:

    每个函数调用的性能从最快到最慢的顺序如下:

    内联>文件过程=嵌套过程=子过程>嵌套共享>子全局>文件全局

    (A>B表示A比B快,A=B表示A和B一样快)

    首先,内联是最快的,因为它不会产生与函数调用相关的开销

    其次,当参数被传递给被调用函数时,调用函数设置参数的方式使被调用函数知道从何处检索参数。这种与函数调用相关的设置通常会带来性能开销,因此文件传递、嵌套传递和子传递比内联传递慢

    第三,如果工作区与嵌套函数共享,并且嵌套函数的参数是工作区内共享的参数,而不是按值传递的参数,则该函数调用的性能将受到抑制。如果MATLAB在共享工作空间中看到共享变量,它将在工作空间中搜索该变量。另一方面,如果参数是由调用函数传递的,那么MATLAB不必搜索它们。此搜索所用的时间说明类型nest share比文件传递、nest传递和子传递慢

    最后,当函数调用涉及全局变量时,性能会受到更大的抑制。这是因为为了寻找全局变量,MATLAB必须将其搜索空间扩展到当前工作空间的外部。此外,涉及全局变量的函数调用比其他函数调用慢得多的原因是MATLAB Accelerator没有优化此类函数调用。使用以下命令关闭MATLAB加速器时

    功能加速关闭 内联和文件全局之间的性能差异变得不那么显著

    请注意,这些行为在很大程度上取决于各种因素,如操作系统、CPU体系结构、MATLAB解释器以及MATLAB代码的作用


    尽管知道两者之间存在差异很有趣,但我高度怀疑您是否能从中获得显著的加速。您所说的“内联函数”是什么意思?匿名函数?根据我的经验,这些函数的性能通常比同等的子函数或M文件函数稍差。或者你的意思是自己做内联,也就是说,实际上不是一个函数!?是的,关于“内联函数”中的模糊性,您是对的。我的意思是用语法定义的匿名函数:
    sqr=@(x)x.^2。不过我不同意你的表现。我做了一个快速的性能测试,比较了将square函数作为一个匿名函数(如上所述)或将其放在一个单独的文件中并执行大量操作的性能。匿名函数的性能明显更好,但粘贴代码的性能更好。