annotate scripts/general/profshow.m @ 18940:6d14aa793e0a

profshow.m: Use current profiler data if there is no input data. * profshow.m: Redo docstring. If no input data, call profile ('info') and use the current profiler dataset. Use 'descend' option to sort to make code clearer. Get rod of for loop for better performance.
author Rik <rik@octave.org>
date Thu, 15 May 2014 09:31:43 -0700
parents be0978e94806
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
18908
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
1 ## Copyright (C) 2012-2014 Daniel Kraft
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
2 ##
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
3 ## This file is part of Octave.
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
4 ##
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
5 ## Octave is free software; you can redistribute it and/or modify it
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
6 ## under the terms of the GNU General Public License as published by
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
7 ## the Free Software Foundation; either version 3 of the License, or (at
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
8 ## your option) any later version.
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
9 ##
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
10 ## Octave is distributed in the hope that it will be useful, but
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
11 ## WITHOUT ANY WARRANTY; without even the implied warranty of
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
13 ## General Public License for more details.
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
14 ##
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
15 ## You should have received a copy of the GNU General Public License
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
16 ## along with Octave; see the file COPYING. If not, see
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
17 ## <http://www.gnu.org/licenses/>.
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
18
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
19 ## -*- texinfo -*-
12872
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
20 ## @deftypefn {Function File} {} profshow (@var{data})
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
21 ## @deftypefnx {Function File} {} profshow (@var{data}, @var{n})
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
22 ## @deftypefnx {Function File} {} profshow ()
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
23 ## @deftypefnx {Function File} {} profshow (@var{n})
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
24 ## Display flat per-function profiler results.
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
25 ##
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
26 ## Print out profiler data (execution time, number of calls) for the most
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
27 ## critical @var{n} functions. The results are sorted in descending order by
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
28 ## the total time spent in each function. If @var{n} is unspecified it
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
29 ## defaults to 20.
12887
ca5c1115b679 Show recursive-flag of functions in profshow.
Daniel Kraft <d@domob.eu>
parents: 12872
diff changeset
30 ##
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
31 ## The input @var{data} is the structure returned by @code{profile ("info")}.
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
32 ## If unspecified, @code{profshow} will use the current profile dataset.
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
33 ##
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
34 ## The attribute column displays @samp{R} for recursive functions, and is blank
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
35 ## for all other function types.
13191
c5ddb99ff5de Put @seealso in profiler functions' docstrings.
Jordi Gutiérrez Hermoso <jordigh@octave.org>
parents: 13141
diff changeset
36 ## @seealso{profexplore, profile}
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
37 ## @end deftypefn
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
38
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
39 ## Built-in profiler.
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
40 ## Author: Daniel Kraft <d@domob.eu>
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
41
12872
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
42 function profshow (data, n = 20)
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
43
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
44 if (nargin > 2)
12872
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
45 print_usage ();
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
46 endif
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
47
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
48 if (nargin == 0)
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
49 data = profile ("info");
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
50 elseif (nargin == 1 && ! isstruct (data))
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
51 n = data;
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
52 data = profile ("info");
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
53 endif
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
54
12872
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
55 n = fix (n);
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
56 if (! isscalar (n) || ! isreal (n) || ! (n > 0))
13141
e81ddf9cacd5 maint: untabify and remove trailing whitespace from source files
John W. Eaton <jwe@octave.org>
parents: 13056
diff changeset
57 error ("profile: N must be a positive integer");
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
58 endif
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
59
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
60 m = length (data.FunctionTable);
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
61 n = min (n, m);
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
62
12872
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
63 ## We want to sort by times in descending order. For this, extract the
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
64 ## times to an array, then sort this, and use the resulting index permutation
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
65 ## to print out our table.
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
66 times = [ data.FunctionTable.TotalTime ];
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
67 totalTime = sum (times);
12872
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
68
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
69 [~, p] = sort (times, "descend");
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
70
12872
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
71 ## For printing the table, find out the maximum length of a function name
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
72 ## so that we can proportion the table accordingly. Based on this,
031e1a2c26f3 Vectorize and use Octave coding conventions for profile script files
Rik <octave@nomad.inbox5.com>
parents: 12871
diff changeset
73 ## we can build the format used for printing table rows.
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
74 nameLen = max (length ("Function"),
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
75 columns (char (data.FunctionTable(p(1:n)).FunctionName)));
18908
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
76 headerFormat = sprintf ("%%4s %%%ds %%4s %%12s %%10s %%12s\n", nameLen);
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
77 rowFormat = sprintf ("%%4d %%%ds %%4s %%12.3f %%10.2f %%12d\n", nameLen);
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
78
18908
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
79 printf (headerFormat, ...
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
80 "#", "Function", "Attr", "Time (s)", "Time (%)", "Calls");
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
81 printf ("%s\n", repmat ("-", 1, nameLen + 2 * 5 + 11 + 2 * 13));
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
82
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
83 for i = 1 : n
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
84 row = data.FunctionTable(p(i));
18908
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
85 timePercent = 100 * row.TotalTime / totalTime;
12889
dae596be0571 profshow.m: Change Matlab-style single quotes to Octave-style double quotes
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12887
diff changeset
86 attr = "";
12887
ca5c1115b679 Show recursive-flag of functions in profshow.
Daniel Kraft <d@domob.eu>
parents: 12872
diff changeset
87 if (row.IsRecursive)
12889
dae596be0571 profshow.m: Change Matlab-style single quotes to Octave-style double quotes
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12887
diff changeset
88 attr = "R";
12887
ca5c1115b679 Show recursive-flag of functions in profshow.
Daniel Kraft <d@domob.eu>
parents: 12872
diff changeset
89 endif
18940
6d14aa793e0a profshow.m: Use current profiler data if there is no input data.
Rik <rik@octave.org>
parents: 18908
diff changeset
90 printf (rowFormat, p(i), row.FunctionName, attr,
18908
be0978e94806 Add column with time percentage to profshow output.
Daniel Kraft <d@domob.eu>
parents: 17744
diff changeset
91 row.TotalTime, timePercent, row.NumCalls);
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
92 endfor
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
93
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
94 endfunction
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
95
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
96
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
97 %!demo
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
98 %! profile on;
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
99 %! A = rand (100);
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
100 %! B = expm (A);
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
101 %! profile off;
12889
dae596be0571 profshow.m: Change Matlab-style single quotes to Octave-style double quotes
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12887
diff changeset
102 %! T = profile ("info");
12871
23377c46516b Implement the profshow function to print profiler results.
Daniel Kraft <d@domob.eu>
parents:
diff changeset
103 %! profshow (T, 10);
12887
ca5c1115b679 Show recursive-flag of functions in profshow.
Daniel Kraft <d@domob.eu>
parents: 12872
diff changeset
104
ca5c1115b679 Show recursive-flag of functions in profshow.
Daniel Kraft <d@domob.eu>
parents: 12872
diff changeset
105 %!demo
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
106 %! profile on;
13837
2c80bbd87f5d don't define functions in test and demo blocks
John W. Eaton <jwe@octave.org>
parents: 13191
diff changeset
107 %! expm (rand (500) + eye (500));
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
108 %! profile off;
12889
dae596be0571 profshow.m: Change Matlab-style single quotes to Octave-style double quotes
Jordi Gutiérrez Hermoso <jordigh@gmail.com>
parents: 12887
diff changeset
109 %! profshow (profile ("info"), 5);
13056
66662c033301 codesprint: tests or profshow
John W. Eaton <jwe@octave.org>
parents: 12977
diff changeset
110
14363
f3d52523cde1 Use Octave coding conventions in all m-file %!test blocks
Rik <octave@nomad.inbox5.com>
parents: 14359
diff changeset
111 %!error profshow (1, 2, 3)
14405
7d5a653825b9 profshow.m: Add more input validation tests
Rik <octave@nomad.inbox5.com>
parents: 14363
diff changeset
112 %!error <N must be a positive integer> profshow (struct (), ones (2))
7d5a653825b9 profshow.m: Add more input validation tests
Rik <octave@nomad.inbox5.com>
parents: 14363
diff changeset
113 %!error <N must be a positive integer> profshow (struct (), 1+i)
7d5a653825b9 profshow.m: Add more input validation tests
Rik <octave@nomad.inbox5.com>
parents: 14363
diff changeset
114 %!error <N must be a positive integer> profshow (struct (), -1)
14237
11949c9795a0 Revamp %!demos in m-files to use Octave coding conventions on spacing, etc.
Rik <octave@nomad.inbox5.com>
parents: 14138
diff changeset
115