【问题标题】:Matlab: Are local functions (subfunctions) compiled together with main function or separately?Matlab:局部函数(子函数)是与主函数一起编译还是单独编译?
【发布时间】:2015-05-18 17:13:29
【问题描述】:

我听说 MATLAB 有一个自动按需编译的函数,如果你像下面的代码那样多次调用一个函数,这可能会产生大量的函数调用开销:

function output = BigFunction( args )
    for i = 1:10000000
        SmallFunction( args );
    end
end

如果我将函数SmallFunction() 作为本地函数放在与BigFunction() 相同的文件中,调用它会更快吗?或者除了将SmallFunction()的代码粘贴到BigFunction()来优化性能还有什么好的解决办法吗?

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

【问题讨论】:

  • 尽管知道存在差异很有趣,但我非常怀疑你会从中获得显着的加速。

标签: performance matlab optimization compiler-optimization


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

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

    问题:

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

    1. 内联函数。函数的主体是写下来的目录(内联)。

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

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

    4. 嵌套函数。参数由封闭函数(nest-pass)传递。

    5. 嵌套函数。参数是与封闭函数共享的参数;封闭函数(nest-share)仅提供索引。

    6. 一个子函数。参数由调用函数传递(子传递)。

    7. 一个子函数。参数是通过引用全局变量来提供的;调用函数(子全局)仅提供索引。

    我想知道总体上哪个函数调用比其他函数调用提供更好的性能。

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

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

    内联 > 文件传递​​ = 嵌套传递 = 子传递 > 嵌套共享 > 子全局 > 文件全局

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

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

    其次,当参数被传递给被调用函数时,调用函数以这样一种方式设置参数,即被调用函数知道在哪里检索它们。这种与函数调用相关的设置通常会产生性能开销,因此文件传递、嵌套传递和子传递比内联要慢。

    第三,如果工作空间与嵌套函数共享,并且嵌套函数的参数是工作空间内共享的参数,而不是按值传递,则该函数调用的性能将被禁止。如果 MATLAB 在共享工作区中看到共享变量,它会在工作区中搜索该变量。另一方面,如果参数由调用函数传递,则 MATLAB 不必搜索它们。此搜索所用的时间说明了 nest-share 类型比 file-pass、nest-pass 和 sub-pass 慢。

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

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

    请注意,这些行为很大程度上取决于各种因素,例如操作系统、CPU 架构、MATLAB 解释器以及 MATLAB 代码正在做什么。

    【讨论】:

    • “内联函数”是什么意思?匿名函数?根据我的经验,这些通常比等效的子函数或 M 文件函数的性能稍差。还是您的意思是自己进行内联,即实际上不是函数!?
    • 是的,您对“内联函数”中的歧义是正确的。我的意思是用语法定义的匿名函数:sqr = @(x) x.^2;。我不同意你的表现。我做了一个快速的性能测试,比较了将平方函数作为上述匿名函数或将其放在单独的文件中并进行大量操作的性能。匿名函数的性能明显更好,但粘贴代码的性能更好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2017-11-21
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多