有没有什么技术可以使 MATLAB 代码执行得更快?
我说的是可以让我的电脑运行更快的东西(比如停止一些 .exe 或软件以提高电脑性能)。我注意到有时我的电脑在两个不同的时间运行相同的任务:例如,他可以在 45 秒内运行一个程序,然后在 10 分钟内再次运行同一个程序。
答案1
是您的计算机上的 MATLAB 运行缓慢,还是您用 MATLAB 编写的程序运行缓慢?
MATLAB 大量使用动态内存分配和重新分配;矩阵或数组大小调整可能非常缓慢且不确定;如果矩阵或数组增长,则会分配新内存并将现有数据复制到新内存,然后再删除旧副本。您可以通过预分配此类数组来避免这种内存抖动:例如此代码:
x = 0;
for k = 2:1000
x(k) = x(k-1) + 5;
end
导致x
每次迭代都会调整大小,并且运行速度非常慢。相比之下,以下代码:
x = zeros(1, 1000);
for k = 2:1000
x(k) = x(k-1) + 5;
end
预先分配数组,以便不会发生调整大小并且运行速度会更快。
MathWorks 网站有一个整頁详细介绍这一技术和其他性能改进技术;该页面涵盖以下内容:
- 预分配数组
- 对大型数据集使用分布式数组
- 如果可能的话,用 parfor 替换 for (并行 for)
- 限制大小和复杂性
- 分配给变量
- 使用适当的逻辑运算符
- 重载内置函数
- 函数通常比脚本更快
- 加载和保存比文件 I/O 函数更快
- 向量化循环
- 避免大型后台进程
请注意,您建议的解决方案位于 MathWorks 列表的最后,您应该首先查看所有其他要点,除非您正在做一些明显耗费资源的事情,例如运行虚拟机,或者在运行 MATLAB 的同时播放高清视频,否则查看其他正在运行的进程可能会为小事烦恼。
答案2
遵循 Clifford 的建议后,您可以使用 MATLAB 分析工具检查程序花费最多时间的地方,通常不会有太多行/函数。然后专注于优化这些行。
答案3
如果您的代码的运行时间变化很大,那么很可能您遇到了一个问题,即有时在某种程度上您会接近虚拟内存。当 MATLAB 必须使用交换空间时,速度会急剧下降。毕竟,您正在使用磁盘空间来替代物理 RAM 的可用性。这是我能给出的最佳理由,因为代码在不同运行中的时间变化幅度相差一个数量级。
使用分析器工具来确定时间都花在了哪里。仔细查看这些行。您是否正在创建一个大型数组,即使这只是在您调用的某个函数中临时完成的?
检查您的系统。查看发生这种情况时,CPU 是否在磁盘访问繁忙时基本处于空闲状态。
当然,如果正如我所建议的,那么解决方案也是合乎逻辑的。
让你的算法在内存方面更加高效。这总是一件好事。
如果您当前的 RAM 少于 2GB,请获取更多。
使用 64 位版本的 MATLAB 并获取更多 RAM。
答案4
我认为,这一定是系统范围内的资源瓶颈,如磁盘访问或内存交换问题。尝试看看会出现什么情况进程探索器,您可能会发现系统中正在发生什么事情。