据我了解,MATLAB在向其他函数发送参数时不能使用pass by reference
。我正在进行音频处理,而且我经常要将波形作为参数传递给函数,并且因为MATLAB使用pass by value
来表示这些参数,所以当我这样做时它会占用大量的RAM。
我正在考虑使用global
变量作为将波形传递到函数中的方法,但我读到的每个地方似乎都有一个普遍的看法,这对于代码组织和潜在的性能问题来说是个坏主意......但我还没有真正阅读有关这可能会如何影响表现的详细答案......
我的问题:使用全局变量(大小> 100MB)将参数传递给MATLAB中的其他函数会产生什么负面影响,无论是 1还是 > 性能和 2) 一般代码组织和良好实践。
编辑:从@ Justin的回答中可以看出,当你不修改函数中的参数时,MATLAB有时会使用传递引用!由此,我有一个关于全局变量性能的第二个相关问题:
使用全局变量会比使用函数的pass by reference
参数慢吗?
答案 0 :(得分:7)
MATLAB 使用传递引用,但也使用copy-on-write。也就是说,你的变量将通过引用传递给函数(因此不会在RAM上加倍),但如果你在函数中更改变量,那么MATLAB将创建一个副本并更改副本(离开原件未受影响)。
这个事实似乎并不太为人所知,但有一个good post on Loren's blog正在讨论它。
底线:听起来你根本不需要使用全局变量(这是一个糟糕的主意,如@Adriaan所说)。
答案 1 :(得分:3)
虽然依赖Justin建议的写入副本通常是最佳选择,但您可以轻松实现按引用传递。 Matlab oop几乎与Matlab 2015b或更新版本中的传统函数一样快,使用handle
是一个合理的选择。
答案 2 :(得分:3)
我昨天遇到了一个有趣的global
变量用例。我尝试使用parfor
并行处理一段代码(1200行,主函数内部的多个函数,不是我编写的)。
出现了一些奇怪的错误,结果发现这段代码写入了一个日志文件,但是使用了多个函数来写入日志文件。而不是每次函数想要写入时都打开和关闭相关的日志文件,这非常慢,文件ID是global
,所以所有写函数都可以访问它。
对于串行的情况,这是完全合理的,但在尝试平行时,使用global
显然也打破了工作者实例的范围。突然之间,我们有4名工人都试图写入同一个日志文件,这导致了一些奇怪的错误。
总而言之,我保持my position使用global
变量一般一个坏主意,虽然我可以看到它在特定情况下的使用,前提是你知道什么你在做什么。
答案 3 :(得分:2)
在Matlab may increase performance中使用全局变量。这是因为您可以避免在 某些情况下 中复制数据。
在尝试进行此类性能调整之前,请仔细考虑项目的成本,以及全局变量带来的诸多弊端。使用对性能有不良后果的全局变量也存在缺陷,这些可能很难避免(尽管可能)。任何充满全局变量的代码往往难以理解。
如果您想查看用于性能的全局变量,可以查看我创建的real-time toolbox for optical flow。这是本机Matlab中唯一能够实现我所知道的实时光流的项目。使用全局变量是这是可行的原因之一。这也是为什么代码很难掌握的原因:Globals是邪恶的。
可以这种方式使用全局变量并不是一种争论它们使用的方式,而是应该暗示某些东西应该用Matlabs不灵活的工作空间概念和全局变量的低效替代品(如guidata / getappdata / setappdata)进行更新。