Main Content

profile

探查函数的执行时间

说明

使用探查器来跟踪执行时间。了解您的 MATLAB® 代码的执行时间有助于对其进行调试和优化。有关探查器用户界面的信息,请参阅 Profiler

示例

profile action 探查函数的执行时间。使用 action 可启动、停止和重新启动探查器,并查看或清除探查统计信息。例如,profile on 可以启动探查器。

示例

profile action option1 ... optionN 使用指定的选项启动或重新启动探查器。例如,profile resume -history 重新启动探查器,并记录函数调用的顺序。

示例

profile option1 ... optionN 设置指定的探查器选项。如果探查器已打开且您指定了任一选项,则 MATLAB 会引发一个错误。要更改选项,应先指定 profile off,然后再指定新的选项。

示例

p = profile('info') 使探查器停止并显示包含结果的结构体。要访问 profile 生成的数据,请使用此语法。

示例

s = profile('status') 返回包含探查器状态信息的结构体。

示例

全部折叠

打开探查器,并调用 magic 函数。

profile on
n = 100;
M = magic(n);

在“探查器”窗口中查看结果。

profile viewer

将结果保存为 HTML 文件。默认情况下,profsave 将文件保存到当前工作文件夹中的 profile_results 子文件夹。

profsave

打开探查器,并调用 magic 函数。

profile on
n = 100;
M = magic(n);

将结果保存到 MAT 文件。

p = profile('info')
save myprofiledata p
p = 

      FunctionTable: [1x1 struct]
    FunctionHistory: [2x2 double]
     ClockPrecision: 3.3475e-07
         ClockSpeed: 3.0600e+09
               Name: 'MATLAB'
           Overhead: 0

使用此主函数和局部函数创建文件 myFunction.m

function c = myFunction(a,b)
c = sqrt(square(a)+square(b));
end

function y = square(x)
y = x.^2;
end

打开探查器,并启用函数调用历史记录选项。探查对 myFunction 函数的调用。

profile on -history
a = rand(5);
b = rand(5);
c = myFunction(a,b);

保存探查结果。

p = profile('info')
p = 

      FunctionTable: [2x1 struct]
    FunctionHistory: [2x6 double]
     ClockPrecision: 3.3475e-07
         ClockSpeed: 3.0600e+09
               Name: 'MATLAB'
           Overhead: 0

显示函数调用历史记录。

p.FunctionHistory
ans =

     0     0     1     0     1     1
     1     2     2     2     2     1

通过迭代器调用历史记录来显示函数进入和退出的信息。

numEvents = size(p.FunctionHistory,2);
for n = 1:numEvents
    name = p.FunctionTable(p.FunctionHistory(2,n)).FunctionName;
    
    if p.FunctionHistory(1,n) == 0
        disp(['Entered ' name]);
    else
        disp(['Exited ' name]);
    end
end
Entered myFunction
Entered myFunction>square
Exited myFunction>square
Entered myFunction>square
Exited myFunction>square
Exited myFunction

将函数调用历史记录设置为默认值。

profile -timestamp
s = profile('status')
s = 

     ProfilerStatus: 'off'
        DetailLevel: 'mmex'
              Timer: 'performance'
    HistoryTracking: 'timestamp'
        HistorySize: 5000000

输入参数

全部折叠

探查器的管制选项,指定为以下选项之一。

选项结果
on

启动探查器,并清除以前记录的探查统计信息。

off

停止探查器。

clear

停止探查器并清除记录的统计信息。

viewer

停止探查器并在“探查器”窗口中显示结果。有关详细信息,请参阅探查器MATLAB Online™ 不支持探查器用户界面。

info

停止探查器并返回包含结果的结构体。

resume重新启动探查器,而不清除以前记录的统计信息。
status

返回包含探查器状态信息的结构体。

一个或多个探查选项,指定为字符向量,这些字符向量对应于历史记录和时钟选项表中的有效设置。

如果您更改探查器设置,则当停止探查器或清除统计信息时,这些设置会保留。要恢复到默认探查器行为,请手动将选项设置为默认值或启动一个新的 MATLAB 会话。

历史记录选项

选项结果
-nohistory

记录基本探查统计信息。

-history

记录基本探查统计信息,以及函数调用的准确顺序,包括函数进入和退出事件。

-timestamp

默认值。记录基本探查统计信息,以及函数调用的准确顺序,包括进入和退出事件,以及每个事件的时间戳。

-historysize integer

指定要记录的函数进入和退出事件的数目。默认情况下,historysize 为 5,000,000。如果函数调用的次数超出指定的 historysize,则 profile 函数除了记录调用顺序,还会继续记录探查统计信息。

时钟选项

选项结果
-timer 'performance'

默认值。使用操作系统提供的时钟挂钟时间来测量性能。

-timer 'processor'

直接使用来自处理器的挂钟时间。有时您的省电设置或多处理器的使用会影响该测量。

-timer 'real'

使用操作系统报告的系统时间。此选项是计算成本最高的测量,对被探查代码的性能影响最大。更改操作系统上的时钟时间会影响此测量。

-timer 'cpu'

使用计算机时间并跨所有线程汇总时间。此测量与挂钟时间不同。例如,pause 函数的计算机时间通常较小,但挂钟时间会考虑实际暂停时间,后者较大。

输出参数

全部折叠

探查器统计信息,以包含以下字段的结构体形式返回。

字段

描述

FunctionTable

函数统计信息,以结构体数组形式返回。数组中的每个结构体都包含有关探查期间所调用的一个函数或局部函数的信息。每个结构体包含以下字段:

  • CompleteName - FunctionName 的完整路径。

  • FunctionName - 函数的名称。如果函数是局部函数,FunctionName 包括主函数。

  • FileName - FunctionName 的完整路径(包含文件扩展名)。如果函数是局部函数,FileName 是主函数的完整路径。

  • Type - 函数的类型。例如,MATLAB 函数、MEX 函数、局部函数或嵌套函数。

  • NumCalls - 被探查的代码调用函数的次数。

  • TotalTime - 函数及其子函数花费的总时间。

  • TotalRecursiveTime - MATLAB 不再使用此字段。

  • Children - 有关该函数调用的函数的信息。数组中的每个条目包含一个子函数的相关信息。结构体包含以下字段:

    • Index - FunctionTable 中子函数信息结构体的索引。

    • NumCalls - 被探查代码调用子函数的次数。

    • TotalTime - 子函数花费的总时间。

  • Parents - 有关 FunctionName 的父函数的信息。数组中的每个结构体包含一个父函数的相关信息。结构体包含以下字段:

    • Index - FunctionTable 中父函数信息结构体的索引。

    • NumCalls - 父函数调用此函数的次数。

  • ExecutedLines - 包含被探查函数的逐行详细信息的数组。

    • 第 1 列 - 执行的代码行在 FileName 中的行号。

    • 第 2 列 - 被探查代码执行该代码行的次数。

    • 第 3 列 - 该代码行花费的总时间。第 3 列条目的总和不一定等于 TotalTime

  • IsRecursive - 指示函数是否递归的指示符。如果值为 1 (true),则函数是递归的。如果值为 0 (false),则函数是非递归的。

  • PartialData - 指示探查统计信息是否不完全的指示符。如果值为逻辑值 1 (true),则在探查期间曾修改函数。例如,如果您编辑了函数或从内存中将其清除。在这种情况下,探查器仅收集在函数修改之前的数据。

FunctionHistory

函数调用历史记录,以数组形式返回。

  • 第 1 行 - 指示函数进入或退出的指示符。探查器用 0 记录函数进入,用 1 记录函数退出。

  • 第 2 行 - FunctionTable 中函数信息结构体的索引。

  • 第 3 行 - 函数进入或退出时间戳的秒部分,指定为自操作系统纪元时间以来经过的时间。仅当指定 -timestamp 历史记录选项时,才会返回此行。

  • 第 4 行 - 函数进入或退出时间戳的微秒部分,指定为自操作系统纪元时间以来经过的时间。仅当指定 -timestamp 历史记录选项时,才会返回此行。

ClockPrecision

profile 函数的时间测量精度,以 double 形式返回。

ClockSpeed

估计的 CPU 时钟速度,以 double 形式返回。

Name

探查器的名称,以字符数组形式返回。

Overhead

保留供将来使用。

探查器状态,以包含以下字段的结构体形式返回。

字段

默认值

ProfilerStatus

'on', 'off'

'off'

DetailLevel

'mmex'

'mmex'

Timer

'performance''processor''cpu''real'

'performance'

HistoryTracking

'on''off''timestamp'

'timestamp'

HistorySize

整数

5000000

局限性

  • MATLAB 探查器在代码运行时执行计算并收集数据。这需要额外的计算资源,并且会导致代码在探查器处于活动状态时的运行速度慢于在探查器不活动时。因此,探查器测量的执行时间应被视为代码性能的相对度量,而不是绝对度量。

  • 如果被探查代码使用间接(或相互)递归,则探查器可能会返回不准确的结果。如果递归是直接递归(单一函数调用自身),则探查器返回对该函数的各次非递归调用的总时间。要确定被探查代码中的函数是否为递归(直接或间接),请检查 FunctionTable 条目中 IsRecursive 字段的值。

  • 评估代码节时不支持探查器。

提示

  • 要打开探查器用户界面,请使用 profile viewer 语法或参阅 ProfilerMATLAB Online 不支持探查器用户界面。

  • 自 MATLAB R2015b 起,默认计时器是 'performance'。在早期版本的 MATLAB 中,默认探查器计时器为 'cpu',它测量计算时间而非挂钟时间。

版本历史记录

在 R2006a 之前推出