探查您的代码以改善性能
什么是探查功能?
通过探查,可以测量运行代码所需的时间和确定 MATLAB® 在哪些位置最耗时。在确定哪些函数耗用大部分时间后,您可以对它们进行评估以确定可能的性能改进。您还可以探查您的代码以确定哪些代码行不运行。确定哪些代码行不运行在为代码开发测试时很有用,也可以作为调试工具来帮助隔离代码中的问题。
您可以使用 MATLAB 探查器或以编程方式使用 profile
函数来以交互方式探查代码。有关以编程方式探查代码的详细信息,请参阅 profile
。如果您要探查并行运行的代码,为获得最佳结果,请使用 Parallel Computing Toolbox™ 并行探查器。有关详细信息,请参阅Profiling Parallel Code (Parallel Computing Toolbox)。
提示
过早优化的代码可能带来无谓的复杂性,而不会显著改善性能。第一次实施应尽可能简单。此后,如果速度成为问题,请使用探查功能来找出瓶颈所在。
探查代码
要探查您的代码并改善其性能,请使用以下常规过程:
对您的代码运行探查器。
查看探查摘要结果。
调查函数和单独的代码行。
例如,您可能要调查占用了大量时间或调用最频繁的函数和代码行。
保存探查结果。
在您的代码中实施可能的性能改进。
例如,如果循环中有一个
load
语句,您可以将load
语句移到循环外以便仅调用一次。保存文件并运行
clear all
。再次运行探查器并将结果与原始结果比较。重复上述步骤,继续改进代码的性能。如果代码用大部分时间来调用少数内置函数,则表示您可能已对代码进行了最大程度的优化。
对代码运行探查器
要对一行代码运行探查器,请执行下列步骤:
转至 App 选项卡,在 MATLAB 下点击探查器图标以打开探查器。您还可以在命令行窗口中键入
profile viewer
。转至探查器选项卡,在探查部分,在编辑框中输入您要探查的代码。
例如,创建函数
solvelotka.m
,它为 MATLAB 附带的 Lotka-Volterra 示例求猎物和捕食者数量的峰值:在编辑框中输入以下语句以探查function [preypeaks,predatorpeaks] = solvelotka(t0, tfinal, y0) [~,y] = ode23(@lotka,[t0 tfinal],y0); preypeaks = calculatepeaks(y(:,1)); predatorpeaks = calculatepeaks(y(:,2)); end function peaks = calculatepeaks(A) [TF,P] = islocalmax(A); peaks = P(TF); end
solvelotka
函数:[preypeaks,predatorpeaks] = solvelotka(0,15,[20;20])
如果您之前在当前 MATLAB 会话中探查过该语句,您也可以从编辑框下拉列表中选择它。
点击
运行并计时。
探查完毕后,探查器会在探查摘要中显示结果。所探查的语句也会在命令行窗口中显示为已运行的状态。
要探查在编辑器中打开的代码文件,请在编辑器选项卡的运行部分中,选择运行 > 运行并计时。探查器探查在当前“编辑器”选项卡中打开的代码文件,并在探查摘要中显示结果。
查看探查摘要结果
对您的代码运行探查器后,探查摘要显示有关代码的总体执行情况的统计信息,并提供调用的每个函数的汇总统计量。例如,下图显示 solvelotka
函数的探查摘要。
在探查摘要结果的顶部,火焰图直观地显示 MATLAB 运行代码所花费的时间。运行的每个函数都由火焰图中的一个条形来表示。用户定义的函数显示为蓝色,MathWorks® 函数显示为灰色。
图中的函数按层次结构顺序显示,父函数在图中较低位置显示,子函数在图中较高位置显示。图中占满底部的名为探查摘要的条形表示已运行的所有代码。图上条形的宽度表示函数运行所用的时间占总运行时间的百分比。
要查看实际的百分比和时间值以及完整函数名称,请将鼠标悬停在图中的条形上。要显示有关函数的详细信息,包括单个代码行的信息,请点击表示该函数的条形。
火焰框下方的函数表显示与火焰图相似的信息。起初,这些函数按处理它们时所花的时间排序。下表说明了每列中的信息。
列 | 描述 |
---|---|
函数名称 | 由所探查的代码调用的函数的名称。 |
调用 | 被探查的代码调用函数的次数。 |
总时间 | 在函数中花费的总时间,以秒为单位。函数所耗用的时间包括子函数所耗费的时间。探查器本身会耗用一些时间,该时间也包括在结果中。对于运行时间无足轻重的文件来说,总时间可以是零。 |
自用时间 | 函数所耗费的总时间,不包括任何子函数所耗用的时间(以秒为单位)。自用时间还包括探查过程产生的一些开销。 |
总时间图 | 以图形方式显示自用时间与总时间的对比情况。 |
要按特定列对函数表进行排序,请点击列标题中的箭头。例如,点击函数名称列中的箭头可按字母顺序对函数进行排序。最初,结果会按总时间顺序显示。要显示有关函数的详细信息,包括单个代码行的信息,请点击函数名称。
调查函数和单独的代码行
要在代码中找到潜在的改进机会,可以在火焰图或函数表中寻找耗费了大量时间或调用最频繁的函数。点击函数名称可显示有关该函数的详细信息,包括有关单个代码行的信息。例如,点击 solvelotka>calculatepeaks
函数。探查器会显示该函数的详细信息。
在页面顶部当前函数的名称旁边,探查器显示父函数调用该函数的次数以及在该函数中花费的总时间。使用火焰图下方显示的链接可在默认编辑器中打开该函数,或将显示的结果复制到单独窗口中。
要返回探查摘要,请在探查器选项卡中,点击 探查摘要按钮。您还可以点击火焰图底部的探查摘要条形。
点击单个函数后,探查器将在下列部分显示其他信息:
部分 | 详细信息 |
---|---|
火焰图 | 火焰图直观地显示 MATLAB 运行所探查的函数花费的时间。该图显示所探查的函数的层次结构,包括子函数(显示在当前函数上方)和父函数(显示在当前函数下方)。用户定义的函数显示为蓝色 ( 将鼠标悬停在图中的条形上可查看实际的百分比和时间值以及完整函数名称。点击表示某函数的条形可显示关于该函数的详细信息。 |
父级 | 调用所探查函数的函数列表,包括父函数调用所探查函数的次数。 点击列表中的函数名称可显示关于该函数的详细信息。 |
占用时间最长的行 | 列出所探查函数中耗用最长处理时间的代码行。 点击代码行可在函数列表部分的函数其余代码的上下文中查看它。 |
子级 | 探查的函数所调用的所有函数列表。 点击列表中的函数名称可显示关于该函数的详细信息。 |
代码分析器结果 | 所探查函数的问题和可能的改进的列表。 |
范围结果 | 有关 MATLAB 在探查时所执行的函数中的代码行的代码覆盖率统计信息。 要对您的代码执行其他代码覆盖率分析,请参阅Collect Statement and Function Coverage Metrics for MATLAB Source Code。 |
函数列表 | 函数的源代码,如果它是 MATLAB 代码文件。 对于每行代码,函数列表都包含以下列:
默认情况下,探查器高亮显示执行时间最长的代码行。高亮显示的颜色越深,执行代码行所耗用的时间越长。要更改高亮显示条件,请转至探查器选项卡,在视图部分中,点击高亮 |
保存结果
要在对代码进行改进后比较所做更改的影响,请保存探查结果。要保存结果,请使用火焰图下方显示的链接将显示的结果复制到单独窗口中。
您还可以通过转至探查器选项卡并点击打印按钮,从探查器中打印您的结果。
在命令行窗口中探查多个语句
要在命令行窗口中探查多个语句,请执行下列步骤:
转至命令行窗口,键入
profile on
。输入并运行您要探查的语句。
运行所有语句后,键入
profile off
。通过键入
profile viewer
打开探查器。您也可以转至 App 选项卡,在 MATLAB 下,点击探查器图标。查看探查摘要结果。
探查 App
您可以探查在 App 设计工具中创建的 App。您还可以探查 MathWorks 产品附带的 App,如 Signal Processing Toolbox™ 附带的滤波器设计和分析工具。
要探查某 App,请执行下列步骤:
转至 App 选项卡,在 MATLAB 下点击探查器图标以打开探查器。您还可以在命令行窗口中键入
profile viewer
。在探查器工具条的探查部分中,点击
开始探查。确保按钮右侧的编辑框中没有代码。
启动该 App。
使用该 App。
完成后,在探查器工具条中点击
停止探查。
查看探查摘要结果。
注意
要在探查中排除 App 启动过程,请颠倒步骤 2 和 3。换句话说,在您点击 开始探查之前,请启动 App。