最近我描述了一些MATLAB代码,我很惊讶在一个使用频繁的函数中看到以下内容:
5.76 198694 58 persistent CONSTANTS;
3.44 198694 59 if isempty(CONSTANTS) % initialize CONSTANTS
换句话说,MATLAB花了大约9秒,超过198694函数调用,声明持久CONSTANTS
并检查它是否已被初始化。这代表 13%在该功能中花费的总时间。
在MATLAB中,持久变量确实会带来很大的性能损失吗?或者我们在这里做了一些非常错误的事情?
更新
@Andrew我尝试了你的示例脚本,我对输出非常非常困惑:
time calls line
6 function has_persistent
6.48 200000 7 persistent CONSTANTS
1.91 200000 8 if isempty(CONSTANTS)
9 CONSTANTS = 42;
10 end
我尝试了bench()命令,它显示我的机器在样本机器的中间范围内。在Intel(R)Core(TM)i7 CPU,4GB RAM上运行Ubuntu 64位。
答案 0 :(得分:8)
这是在Matlab中使用持久变量的标准方法。你正在做你应该做的事。会有明显的开销,但你的时间确实有点高得惊人。
这是我在Windows XP x64下在3.0 GHz Intel Core 2 QX9650机器上运行32位Matlab R2009b的类似测试。在其他机器和版本上的类似结果。比你的时间快约5倍。
测试:
function call_has_persistent
for i = 1:200000
has_persistent();
end
function has_persistent
persistent CONSTANTS
if isempty(CONSTANTS)
CONSTANTS = 42;
end
结果:
0.89 200000 7 persistent CONSTANTS
0.25 200000 8 if isempty(CONSTANTS)
你在运行什么Matlab版本,操作系统和CPU? CONSTANTS初始化了什么? Matlab的bench()输出对你的机器来说是否合理?
你的时间确实很高。可能存在要修复的错误或配置问题。但是如果你真的想快速获得Matlab代码,那么标准的建议是“向量化”它:重构代码,以便在较大的输入数组上进行较少的函数调用,并利用Matlab的内置向量化函数代替循环或控制结构,以避免首先调用该函数200,000。如果可能的话。 Matlab每个函数或方法调用的开销相对较高(某些数字请参见Is MATLAB OOP slow or am I doing something wrong?),因此通过重构消除函数调用而不是更快地调用单个函数来获得更多里程。
可能值得在您的计算机上对其他一些基本的Matlab操作进行基准测试,看看它是否只是“持久”似乎很慢。同时尝试分析这个小的call_has_persistent测试脚本,看看你的函数的上下文是否有所作为。