【问题标题】:MATLAB: "Loading" a function for fast accessMATLAB:“加载”一个快速访问的函数
【发布时间】:2018-10-24 07:52:07
【问题描述】:

我必须在 MATLAB 中编写一个相当复杂的函数;我们称之为f。我有一个主程序,比如main.m,它使用了f

如果我要遵循我过去的习惯,每当处理像f 这样的复杂函数时,我会将其写在单独的文件f.m 中,并在需要时从main.m 中调用它。但是对于手头的问题,我将不得不使用f * 很多 * 而且我担心从磁盘读取会减慢我已经需要很长时间才能运行的代码。

所以我想问一下,这是否是一个有效的问题:即,每次我命令 MATLAB(比如 2017a 或更高版本)从磁盘读取来自 main.m 内的 f 还是这样做更聪明的东西?如果前者是真的,那么从main.m 中多次使用f 的有效方式(时间方面)是什么?如果f 是迭代的(即f 调用自身),这些答案中的任何一个是否会改变?

【问题讨论】:

    标签: matlab performance function memory-management scope


    【解决方案1】:

    MATLAB 在第一次调用时加载并解析函数 M 文件,并将其存储在内存中,以便后续调用不需要再次解析它。您可以通过在干净的 MATLAB 会话中调用您的函数 f 两次,使用 tic/toc 对其进行计时,可以看到这是真的:

    tic; f(...); toc
    tic; f(...); toc
    

    第一次应该比第二次花一点时间。对于一个非常快速的功能,这个时间差将非常大。对于需要几秒钟的功能,差异可能没有意义。

    您可以使用函数inmem查看内存中加载了哪些函数。

    当您调用clear all or clear functions 时,函数会从内存中删除(某些其他形式的clear 也会删除函数)。避免使用这些。

    【讨论】:

    • 谢谢克里斯。这是否意味着在程序中定义一个函数(在我的例子中,在main.m 中定义f)没有内在的性能优势? (当然,这减少了文件的数量。)换句话说,这是否意味着,对于上述问题,我可以继续使用我的模块化方法(即在单独的 f.m 上使用 f)而不用担心性能损失?
    • @yurnero:有很多不同的事情需要考虑。 (1) 一旦文件被加载,在同一个文件或单独的文件中执行函数不应该有时间差。 (2)在main.m文件中定义f时,会在main执行时解析,所以第一次main调用f,会是(非常略)比ff.m 中时快。 (3) 我不确定这一点,但我认为,您拥有的 M 文件越多,MATLAB 找到运行它的正确文件所需的时间就越长。不过,一些额外的文件应该无关紧要。
    • 所以我会说是的,继续。你知道private目录吗?
    • 你指的是这个:mathworks.com/help/matlab/matlab_prog/private-functions.html?我明白他们在说什么,但恐怕我无法将它与我们的主题联系起来。你能解释一下吗?
    • @yurnero:这根本与效率无关,但它是一种将功能拆分到只保留一个入口点的文件的好方法。您可以通过将f 粘贴在main.m 旁边的子目录private 中来使f 成为私有函数。 main 将能够调用它,但您的用户将无法直接调用它。在您的情况下,这可能有意义,也可能没有意义,这只是一个建议,因为您正在跨文件拆分代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-20
    相关资源
    最近更新 更多