Mercurial > hg > octave-nkf
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 |
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 |