我讨厌使用全局变量,每个人都应该这样做。如果一种语言无法使用全局变量,则应该对其进行更新。目前,当效率是目标时,我不知道在 Matlab 中使用全局变量有什么好的替代方法。
据我所知,只能通过 4 种方式在回调之间共享数据:
- 嵌套函数
- getappdata(guidata 使用什么)
- 句柄派生类对象
- 全局变量
嵌套函数强制整个项目位于单个 m 文件中,并且句柄派生类对象(发送到回调),给出不合理的overhead我上次检查过。
比较获取应用程序数据/guidata with 全局变量,在给定的回调中你可以写(假设uglyGlobal
以 1000x1000 垫子形式存在):
global uglyGlobal;
prettyLocal = uglyGlobal;
prettyLocal(10:100,10:100) = 0;
uglyGlobal = prettyLocal;
或者你可以写(假设uglyAppdata
以 1000x1000 垫子形式存在):
prettyLocal = getappdata(0,'uglyAppdata');
prettyLocal(10:100,10:100) = 0;
setappdata(0,'x',prettyLocal);
上面的代码片段应该以同样的方式工作。仅通过以下方式就可以(但不能保证)更有效:
global uglyGlobal;
uglyGlobal(10:100,10:100) = 0;
这个片段与之前的片段不同,may不触发 Matlab 中的写时复制。全局工作区中的数据被修改,并且(可能)仅在那里。
但是,如果我们进行无害的修改:
global uglyGlobal;
prettyLocal = uglyGlobal;
uglyGlobal(10:100,10:100) = 0;
Matlab 将确保prettyLocal
获取自己的数据副本。当您分析时,上面的第三行将显示为罪魁祸首。更糟糕的是我的大脑(全局变量往往会这样做),任何其他存在的具有对全局变量的本地引用的工作区都会为该变量创建一个写时复制触发器,每个触发器一个。
然而,当且仅当确保不存在本地引用:
仔细使用全局变量真的可以在 Matlab 中产生最佳性能的程序吗?
注意:我会提供一些计时结果,但不幸的是我无法再访问 Matlab。