Mercurial > hg > octave-nkf
annotate scripts/general/profshow.m @ 19898:4197fc428c7d
maint: Update copyright notices for 2015.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Wed, 11 Feb 2015 14:19:08 -0500 |
parents | 6d14aa793e0a |
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 |