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