程序调试与优化
程序调试(Debug) 是程序设计的重要环节,也是程序设计人员必须掌握的重要技能。
程序设计的思路是多种多样的,针对同样的问题可以设计出不同的程序,而不同的程序其执行效率会有很大不同,特别是数据规模很大时,差别尤为明显,所以,有时需要借助于性能分析工具分析程序的执行效率,并充分利用 MATLAB 的特点,对程序进行优化,从而达到提高程序性能的目的。
1 程序调试方法
一般来说,应用程序的错误有两类,一类是语法错误,另一类是运行时的错误。
MATLAB 能够检查出大部分的语法错误,给出相应错误信息,并标出错误在程序中的行号。程序运行时的错误是指程序的运行结果有错误,这类错误也称为程序逻辑错误。
MATLAB 系统对逻辑错误是无能为力的,不会给出任何提示信息,这时可以通过一些调试方法来发现程序中的逻辑错误。
1.利用调试函数进行程序调试
MATLAB提供了一系列的程序调试函数,用于程序执行过程中的断点操作、执行控制等。 在MATLAB命令行窗口输入以下命令将输出调试函数及其用途简介。
>>help debug
常用的调试函数有以下几个。
(1)dbstop: 在程序的适当位置设置断点,使得系统在断点前停止执行
(2)dbclear: 清除用dbstop 函数设置的断点。
(3)dbcont: 从断点处恢复程序的执行,直到遇到程序的其他断点或错误。
(4)dbstep: 执行一行或多行语句,执行完后返回调试模式,如果在执行过程中遇到断点, 程序将中止。
(5)dbquit: 退出调试模式并返回到基本工作区,所有断点仍有效。
2.利用调试工具进行程序调试
在MATLAB编辑器中新建一个M 文件或打开一个M 文件时,“编辑器”选项卡提供了“断点”命令组,通过对M 文件设置断点可以使程序运行到某一行暂停运行
在M 文件中设置断点并运行程序,程序即进入调试模式,并运行到第一个断点处,此时“编 辑器”选项卡上出现“调试”命令组,命令行窗口的提示符相应变成K>>。
控制单步运行的命令共有4个。在程序运行之前,有些命令按钮未激活。只有当程序中设置了断点,且程序停止在第一个断点处时这些命令按钮才被激活,这些命令按钮功能如下。
(1)步进:单步运行。每单击一次,程序运行一条语句,但不进入函数。
(2)步入:单步运行。遇到函数时进入函数内,仍单步运行。
(3)步出:停止单步运行。如果是在函数中,跳出函数;如果不在函数中,直接运行到下 一个断点处。
(4)运行到光标处:直接运行到光标所在的位置。
2 程序性能分析与优化
1.程序性能分析
利用探查器(Profiler)、tic函数和 toc 函数能分析程序各环节的耗时情况,分析报告能帮 助用户寻找影响程序运行速度的“瓶颈”所在,以便于进行代码优化。
探查器以图形化界面让用户深入地了解程序执行过程中各函数及函数中的每条语句所耗 费的时间,从而有针对性地改进程序,提高程序的运行效率。
在 MATLAB的命令行窗口输入以下命令:
>>profile on
>>testp
>>profile viewer
这时 ,MATLAB 将打开“探查器”窗口,显示分析结果,
2程序优化
MATLAB是解释型语言,计算速度较慢,所以在程序设计时如何提高程序的运行速度是需 要重点考虑的问题。优化程序运行可采用以下方法。
(1)采用向量化运算。在实际 MATLAB 程序设计中,为了提高程序的执行速度,常用向量或矩阵运算来代替循环操作。例如,:
n=100;
i=1:n;
f=1./(i.*i);
y=sum(f)
y =
1.6350
如果程序中的n 值由100改成100000,可以明显地看出,用向量计算方法编写的程序比循环程序要快得多。
(2)预分配内存空间。通过在循环之前预分配向量或数组的内存空间可以提高for 循环的 处理速度。例如,下面的代码用函数 zeros 预分配 for 循环中用到的向量a 的内存空间,使得这个for循环的运行速度显著加快。
程序1:
clear;
a=0;
for n=2:1000
a(n)=a(n-1)+10;
end
程序2:
clear;
a=zeros(1,1000);
for n=2:1000
a(n)=a(n-1)+10;
end
程序2采用了预定义矩阵的方法,运行时间比程序1要短。
(3)减小运算强度。在实现有关运算时,尽量采用运算量更小的运算,从而提高运算速度。 一般来说,乘法比乘方运算快,加法比乘法运算快。例如:
clear;
a=rand(32); %生成一个32×32矩阵
x=a.^3;
y=a.*a.*a;
一般来说,乘法比乘方运算快,加法比乘法运算快。例如:
clear;
a=rand(32); %生成一个32×32矩阵
x=a.^3;
y=a.*a.*a;