annotate lisp/emacs-lisp/elp.el @ 69478:e8bb5df2ba7a

Add index entries around each paragraph rather than depend on entries from beginning of node. Doing so ensures that index entries are less likely to be forgotten if text is cut and pasted, and are necessary anyway if the references are on a separate page. It seems that makeinfo is now (v. 4.8) only producing one index entry per node, so there is no longer any excuse not to. Use subheading instead of heading. The incorrect use of heading produced very large fonts in Info--as large as the main heading. (From Bill Wohler): MH-E never did appear in Emacs 21--MH-E versions 6 and 7 appeared *around* the time of these Emacs releases.
author Bill Wohler <wohler@newt.com>
date Wed, 15 Mar 2006 00:26:12 +0000
parents 067115a6e738
children 7a3f13e2dd57 c5406394f567
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
1 ;;; elp.el --- Emacs Lisp Profiler
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
2
64751
5b1a238fcbb4 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 64085
diff changeset
3 ;; Copyright (C) 1994, 1995, 1997, 1998, 2001, 2002, 2003, 2004,
68648
067115a6e738 Update years in copyright notice; nfc.
Thien-Thi Nguyen <ttn@gnuvola.org>
parents: 67188
diff changeset
4 ;; 2005, 2006 Free Software Foundation, Inc.
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
5
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
6 ;; Author: Barry A. Warsaw
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
7 ;; Maintainer: FSF
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
8 ;; Created: 26-Feb-1994
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
9 ;; Keywords: debugging lisp tools
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
10
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
11 ;; This file is part of GNU Emacs.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
12
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
13 ;; GNU Emacs is free software; you can redistribute it and/or modify
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
14 ;; it under the terms of the GNU General Public License as published by
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
15 ;; the Free Software Foundation; either version 2, or (at your option)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
16 ;; any later version.
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
17
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
18 ;; GNU Emacs is distributed in the hope that it will be useful,
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
21 ;; GNU General Public License for more details.
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
22
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
23 ;; You should have received a copy of the GNU General Public License
14169
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 10280
diff changeset
24 ;; along with GNU Emacs; see the file COPYING. If not, write to the
64085
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64030
diff changeset
25 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18a818a2ee7c Update FSF's address.
Lute Kamstra <lute@gnu.org>
parents: 64030
diff changeset
26 ;; Boston, MA 02110-1301, USA.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;;; Commentary:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
29 ;;
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
30 ;; If you want to profile a bunch of functions, set elp-function-list
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
31 ;; to the list of symbols, then do a M-x elp-instrument-list. This
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
32 ;; hacks those functions so that profiling information is recorded
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
33 ;; whenever they are called. To print out the current results, use
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
34 ;; M-x elp-results. If you want output to go to standard-output
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
35 ;; instead of a separate buffer, setq elp-use-standard-output to
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
36 ;; non-nil. With elp-reset-after-results set to non-nil, profiling
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
37 ;; information will be reset whenever the results are displayed. You
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
38 ;; can also reset all profiling info at any time with M-x
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
39 ;; elp-reset-all.
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
40 ;;
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
41 ;; You can also instrument all functions in a package, provided that
42348
e012bc3e9105 Comment change.
Richard M. Stallman <rms@gnu.org>
parents: 42206
diff changeset
42 ;; the package follows the GNU coding standard of a common textual
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
43 ;; prefix. Use M-x elp-instrument-package for this.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
45 ;; If you want to sort the results, set elp-sort-by-function to some
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 ;; predicate function. The three most obvious choices are predefined:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
47 ;; elp-sort-by-call-count, elp-sort-by-average-time, and
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
48 ;; elp-sort-by-total-time. Also, you can prune from the output, all
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
49 ;; functions that have been called fewer than a given number of times
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
50 ;; by setting elp-report-limit.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
52 ;; Elp can instrument byte-compiled functions just as easily as
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
53 ;; interpreted functions, but it cannot instrument macros. However,
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
54 ;; when you redefine a function (e.g. with eval-defun), you'll need to
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
55 ;; re-instrument it with M-x elp-instrument-function. This will also
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
56 ;; reset profiling information for that function. Elp can handle
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
57 ;; interactive functions (i.e. commands), but of course any time spent
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
58 ;; idling for user prompts will show up in the timing results.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 ;; You can also designate a `master' function. Profiling times will
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 ;; be gathered for instrumented functions only during execution of
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 ;; this master function. Thus, if you have some defuns like:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 ;; (defun foo () (do-something-time-intensive))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 ;; (defun bar () (foo))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 ;; (defun baz () (bar) (foo))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
68 ;; and you want to find out the amount of time spent in bar and foo,
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
69 ;; but only during execution of bar, make bar the master. The call of
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
70 ;; foo from baz will not add to foo's total timing sums. Use M-x
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
71 ;; elp-set-master and M-x elp-unset-master to utilize this feature.
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
72 ;; Only one master function can be set at a time.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 ;; You can restore any function's original function definition with
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 ;; elp-restore-function. The other instrument, restore, and reset
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76 ;; functions are provided for symmetry.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
77
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
78 ;; Here is a list of variable you can use to customize elp:
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
79 ;; elp-function-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
80 ;; elp-reset-after-results
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
81 ;; elp-sort-by-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
82 ;; elp-report-limit
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
83 ;;
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
84 ;; Here is a list of the interactive commands you can use:
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
85 ;; elp-instrument-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
86 ;; elp-restore-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
87 ;; elp-instrument-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
88 ;; elp-restore-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
89 ;; elp-instrument-package
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
90 ;; elp-restore-all
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
91 ;; elp-reset-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
92 ;; elp-reset-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
93 ;; elp-reset-all
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
94 ;; elp-set-master
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
95 ;; elp-unset-master
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
96 ;; elp-results
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
97
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
98 ;; Note that there are plenty of factors that could make the times
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
99 ;; reported unreliable, including the accuracy and granularity of your
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
100 ;; system clock, and the overhead spent in lisp calculating and
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
101 ;; recording the intervals. I figure the latter is pretty constant,
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
102 ;; so while the times may not be entirely accurate, I think they'll
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
103 ;; give you a good feel for the relative amount of work spent in the
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
104 ;; various lisp routines you are profiling. Note further that times
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
105 ;; are calculated using wall-clock time, so other system load will
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
106 ;; affect accuracy too.
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
107
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
108 ;;; Background:
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
109
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
110 ;; This program was inspired by the only two existing Emacs Lisp
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
111 ;; profilers that I'm aware of, Boaz Ben-Zvi's profile.el, and Root
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
112 ;; Boy Jim's profiler.el. Both were written for Emacs 18 and both were
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
113 ;; pretty good first shots at profiling, but I found that they didn't
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
114 ;; provide the functionality or interface that I wanted, so I wrote
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
115 ;; this. I've tested elp in XEmacs 19 and Emacs 19. There's no point
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
116 ;; in even trying to make this work with Emacs 18.
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
117
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
118 ;; Unlike previous profilers, elp uses Emacs 19's built-in function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
119 ;; current-time to return interval times. This obviates the need for
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
120 ;; both an external C program and Emacs processes to communicate with
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
121 ;; such a program, and thus simplifies the package as a whole.
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
122
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
123 ;; TBD:
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
124 ;; Make this act like a real profiler, so that it records time spent
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
125 ;; in all branches of execution.
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
126
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127 ;;; Code:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
129
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
130 ;; start of user configuration variables
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131 ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
132
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
133 (defgroup elp nil
64030
c2d80c96de71 (elp): Finish `defgroup' description with period.
Juanma Barranquero <lekktu@gmail.com>
parents: 58008
diff changeset
134 "Emacs Lisp Profiler."
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
135 :group 'lisp)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
136
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
137 (defcustom elp-function-list nil
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
138 "*List of functions to profile.
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
139 Used by the command `elp-instrument-list'."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
140 :type '(repeat function)
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
141 :group 'elp)
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
142
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
143 (defcustom elp-reset-after-results t
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
144 "*Non-nil means reset all profiling info after results are displayed.
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
145 Results are displayed with the `elp-results' command."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
146 :type 'boolean
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
147 :group 'elp)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
148
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
149 (defcustom elp-sort-by-function 'elp-sort-by-total-time
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 "*Non-nil specifies elp results sorting function.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151 These functions are currently available:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 elp-sort-by-call-count -- sort by the highest call count
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 elp-sort-by-total-time -- sort by the highest total time
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155 elp-sort-by-average-time -- sort by the highest average times
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
157 You can write you're own sort function. It should adhere to the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 interface specified by the PRED argument for the `sort' defun. Each
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
159 \"element of LIST\" is really a 4 element vector where element 0 is
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
160 the call count, element 1 is the total time spent in the function,
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
161 element 2 is the average time spent in the function, and element 3 is
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
162 the symbol's name string."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
163 :type 'function
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
164 :group 'elp)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
165
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
166 (defcustom elp-report-limit 1
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
167 "*Prevents some functions from being displayed in the results buffer.
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
168 If a number, no function that has been called fewer than that number
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
169 of times will be displayed in the output buffer. If nil, all
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
170 functions will be displayed."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
171 :type '(choice integer
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
172 (const :tag "Show All" nil))
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
173 :group 'elp)
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
174
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
175 (defcustom elp-use-standard-output nil
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
176 "*Non-nil says to output to `standard-output' instead of a buffer."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
177 :type 'boolean
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
178 :group 'elp)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
179
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
180 (defcustom elp-recycle-buffers-p t
42206
0f4506820432 Doc fix.
Pavel Janík <Pavel@Janik.cz>
parents: 41177
diff changeset
181 "*nil says to not recycle the `elp-results-buffer'.
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
182 In other words, a new unique buffer is create every time you run
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
183 \\[elp-results]."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
184 :type 'boolean
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
185 :group 'elp)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
186
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
188 ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
189 ;; end of user configuration variables
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
190
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
191
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 (defvar elp-results-buffer "*ELP Profiling Results*"
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193 "Buffer name for outputting profiling results.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 (defconst elp-timer-info-property 'elp-info
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196 "ELP information property name.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 (defvar elp-all-instrumented-list nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199 "List of all functions currently being instrumented.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 (defvar elp-record-p t
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 "Controls whether functions should record times or not.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203 This variable is set by the master function.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 (defvar elp-master nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206 "Master function symbol.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
207
41177
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
208 (defvar elp-not-profilable
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
209 ;; First, the functions used inside each instrumented function:
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
210 '(elp-wrapper called-interactively-p
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
211 ;; Then the functions used by the above functions. I used
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
212 ;; (delq nil (mapcar (lambda (x) (and (symbolp x) (fboundp x) x))
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
213 ;; (aref (symbol-function 'elp-wrapper) 2)))
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
214 ;; to help me find this list.
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
215 error call-interactively apply current-time)
41177
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
216 "List of functions that cannot be profiled.
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
217 Those functions are used internally by the profiling code and profiling
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
218 them would thus lead to infinite recursion.")
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
219
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
220 (defun elp-profilable-p (fun)
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
221 (and (symbolp fun)
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
222 (fboundp fun)
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
223 (not (or (memq fun elp-not-profilable)
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
224 (keymapp fun)
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
225 (memq (car-safe (symbol-function fun)) '(autoload macro))
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
226 (condition-case nil
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
227 (when (subrp (indirect-function fun))
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
228 (eq 'unevalled
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
229 (cdr (subr-arity (indirect-function fun)))))
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
230 (error nil))))))
41177
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
231
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
232
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
233 ;;;###autoload
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
234 (defun elp-instrument-function (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
235 "Instrument FUNSYM for profiling.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
236 FUNSYM must be a symbol of a defined function."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 (interactive "aFunction to instrument: ")
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
238 ;; restore the function. this is necessary to avoid infinite
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
239 ;; recursion of already instrumented functions (i.e. elp-wrapper
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
240 ;; calling elp-wrapper ad infinitum). it is better to simply
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
241 ;; restore the function than to throw an error. this will work
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
242 ;; properly in the face of eval-defun because if the function was
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
243 ;; redefined, only the timer info will be nil'd out since
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
244 ;; elp-restore-function is smart enough not to trash the new
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
245 ;; definition.
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
246 (elp-restore-function funsym)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 (let* ((funguts (symbol-function funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 (infovec (vector 0 0 funguts))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 (newguts '(lambda (&rest args))))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
250 ;; we cannot profile macros
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
251 (and (eq (car-safe funguts) 'macro)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
252 (error "ELP cannot profile macro: %s" funsym))
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
253 ;; TBD: at some point it might be better to load the autoloaded
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
254 ;; function instead of throwing an error. if we do this, then we
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
255 ;; probably want elp-instrument-package to be updated with the
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
256 ;; newly loaded list of functions. i'm not sure it's smart to do
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
257 ;; the autoload here, since that could have side effects, and
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
258 ;; elp-instrument-function is similar (in my mind) to defun-ish
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
259 ;; type functionality (i.e. it shouldn't execute the function).
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
260 (and (eq (car-safe funguts) 'autoload)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
261 (error "ELP cannot profile autoloaded function: %s" funsym))
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
262 ;; We cannot profile functions used internally during profiling.
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
263 (unless (elp-profilable-p funsym)
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
264 (error "ELP cannot profile the function: %s" funsym))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265 ;; put rest of newguts together
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 (if (commandp funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 (setq newguts (append newguts '((interactive)))))
41177
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
268 (setq newguts (append newguts `((elp-wrapper
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
269 (quote ,funsym)
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
270 ,(when (commandp funsym)
57884
9fdca2852881 (elp-instrument-function): Use called-interactively-p.
Richard M. Stallman <rms@gnu.org>
parents: 57520
diff changeset
271 '(called-interactively-p))
41177
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
272 args))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 ;; to record profiling times, we set the symbol's function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 ;; definition so that it runs the elp-wrapper function with the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 ;; function symbol as an argument. We place the old function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 ;; definition on the info vector.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
277 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
278 ;; The info vector data structure is a 3 element vector. The 0th
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
279 ;; element is the call-count, i.e. the total number of times this
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 ;; function has been entered. This value is bumped up on entry to
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 ;; the function so that non-local exists are still recorded. TBD:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 ;; I haven't tested non-local exits at all, so no guarantees.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 ;; The 1st element is the total amount of time in usecs that have
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 ;; been spent inside this function. This number is added to on
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 ;; function exit.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288 ;; The 2nd element is the old function definition list. This gets
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 ;; funcall'd in between start/end time retrievals. I believe that
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 ;; this lets us profile even byte-compiled functions.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 ;; put the info vector on the property list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293 (put funsym elp-timer-info-property infovec)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294
37785
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
295 ;; Set the symbol's new profiling function definition to run
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
296 ;; elp-wrapper.
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
297 (let ((advice-info (get funsym 'ad-advice-info)))
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
298 (if advice-info
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
299 (progn
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
300 ;; If function is advised, don't let Advice change
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
301 ;; its definition from under us during the `fset'.
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
302 (put funsym 'ad-advice-info nil)
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
303 (fset funsym newguts)
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
304 (put funsym 'ad-advice-info advice-info))
908fb90452ba (elp-instrument-function): Handle advised
Gerd Moellmann <gerd@gnu.org>
parents: 37730
diff changeset
305 (fset funsym newguts)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
307 ;; add this function to the instrumentation list
41177
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
308 (unless (memq funsym elp-all-instrumented-list)
830a17080380 (elp-not-profilable): New var.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 38414
diff changeset
309 (push funsym elp-all-instrumented-list))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311 (defun elp-restore-function (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
312 "Restore an instrumented function to its original definition.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 Argument FUNSYM is the symbol of a defined function."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 (interactive "aFunction to restore: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 (let ((info (get funsym elp-timer-info-property)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 ;; delete the function from the all instrumented list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 (setq elp-all-instrumented-list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 (delq funsym elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
320 ;; if the function was the master, reset the master
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
321 (if (eq funsym elp-master)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
322 (setq elp-master nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
323 elp-record-p t))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
324
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
325 ;; zap the properties
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
326 (put funsym elp-timer-info-property nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
327
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
328 ;; restore the original function definition, but if the function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
329 ;; wasn't instrumented do nothing. we do this after the above
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
330 ;; because its possible the function got un-instrumented due to
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
331 ;; circumstances beyond our control. Also, check to make sure
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
332 ;; that the current function symbol points to elp-wrapper. If
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
333 ;; not, then the user probably did an eval-defun, or loaded a
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
334 ;; byte-compiled version, while the function was instrumented and
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
335 ;; we don't want to destroy the new definition. can it ever be
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
336 ;; the case that a lisp function can be compiled instrumented?
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
337 (and info
17420
782c3dac70b1 (elp-functionp): Definitions deleted; use functionp.
Richard M. Stallman <rms@gnu.org>
parents: 17419
diff changeset
338 (functionp funsym)
29211
88e33ac31c14 (elp-restore-function): Don't use obsolete byte-code-function-p.
Dave Love <fx@gnu.org>
parents: 21172
diff changeset
339 (not (byte-code-function-p (symbol-function funsym)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 (assq 'elp-wrapper (symbol-function funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 (fset funsym (aref info 2)))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
343 ;;;###autoload
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (defun elp-instrument-list (&optional list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345 "Instrument for profiling, all functions in `elp-function-list'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 Use optional LIST if provided instead."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 (interactive "PList of functions to instrument: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (let ((list (or list elp-function-list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 (mapcar 'elp-instrument-function list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
351 ;;;###autoload
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
352 (defun elp-instrument-package (prefix)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
353 "Instrument for profiling, all functions which start with PREFIX.
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
354 For example, to instrument all ELP functions, do the following:
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
355
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
356 \\[elp-instrument-package] RET elp- RET"
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
357 (interactive
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
358 (list (completing-read "Prefix of package to instrument: "
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
359 obarray 'elp-profilable-p)))
37730
76d0f25cf1a3 (elp-instrument-package): Don't allow empty prefixes.
Eli Zaretskii <eliz@gnu.org>
parents: 33128
diff changeset
360 (if (zerop (length prefix))
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
361 (error "Instrumenting all Emacs functions would render Emacs unusable"))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
362 (elp-instrument-list
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
363 (mapcar
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
364 'intern
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
365 (all-completions prefix obarray 'elp-profilable-p))))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
366
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 (defun elp-restore-list (&optional list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 "Restore the original definitions for all functions in `elp-function-list'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369 Use optional LIST if provided instead."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 (interactive "PList of functions to restore: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 (let ((list (or list elp-function-list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 (mapcar 'elp-restore-function list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374 (defun elp-restore-all ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 "Restores the original definitions of all functions being profiled."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 (interactive)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 (elp-restore-list elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 (defun elp-reset-function (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 "Reset the profiling information for FUNSYM."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 (interactive "aFunction to reset: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (let ((info (get funsym elp-timer-info-property)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (or info
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
385 (error "%s is not instrumented for profiling" funsym))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 (aset info 0 0) ;reset call counter
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 (aset info 1 0.0) ;reset total time
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
388 ;; don't muck with aref 2 as that is the old symbol definition
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 ))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 (defun elp-reset-list (&optional list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392 "Reset the profiling information for all functions in `elp-function-list'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393 Use optional LIST if provided instead."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
394 (interactive "PList of functions to reset: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
395 (let ((list (or list elp-function-list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
396 (mapcar 'elp-reset-function list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
397
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398 (defun elp-reset-all ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 "Reset the profiling information for all functions being profiled."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 (interactive)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 (elp-reset-list elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 (defun elp-set-master (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 "Set the master function for profiling."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 (interactive "aMaster function: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 ;; when there's a master function, recording is turned off by
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 ;; default
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 (setq elp-master funsym
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 elp-record-p nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 ;; make sure master function is instrumented
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 (or (memq funsym elp-all-instrumented-list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 (elp-instrument-function funsym)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 (defun elp-unset-master ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 "Unsets the master function."
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
416 (interactive)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 ;; when there's no master function, recording is turned on by default.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 (setq elp-master nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 elp-record-p t))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
421
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
422 (defsubst elp-elapsed-time (start end)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
423 (+ (* (- (car end) (car start)) 65536.0)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
424 (- (car (cdr end)) (car (cdr start)))
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
425 (/ (- (car (cdr (cdr end))) (car (cdr (cdr start)))) 1000000.0)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
427 (defun elp-wrapper (funsym interactive-p args)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
428 "This function has been instrumented for profiling by the ELP.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
429 ELP is the Emacs Lisp Profiler. To restore the function to its
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
430 original definition, use \\[elp-restore-function] or \\[elp-restore-all]."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
431 ;; turn on recording if this is the master function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
432 (if (and elp-master
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
433 (eq funsym elp-master))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 (setq elp-record-p t))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
435 ;; get info vector and original function symbol
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
436 (let* ((info (get funsym elp-timer-info-property))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 (func (aref info 2))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 result)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 (or func
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
440 (error "%s is not instrumented for profiling" funsym))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 (if (not elp-record-p)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442 ;; when not recording, just call the original function symbol
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443 ;; and return the results.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 (setq result
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 (if interactive-p
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 (call-interactively func)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (apply func args)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 ;; we are recording times
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
449 (let (enter-time exit-time)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 ;; increment the call-counter
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 (aset info 0 (1+ (aref info 0)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 ;; now call the old symbol function, checking to see if it
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453 ;; should be called interactively. make sure we return the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 ;; correct value
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
455 (if interactive-p
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
456 (setq enter-time (current-time)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
457 result (call-interactively func)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
458 exit-time (current-time))
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
459 (setq enter-time (current-time)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
460 result (apply func args)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
461 exit-time (current-time)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
462 ;; calculate total time in function
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
463 (aset info 1 (+ (aref info 1) (elp-elapsed-time enter-time exit-time)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
464 ))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
465 ;; turn off recording if this is the master function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
466 (if (and elp-master
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
467 (eq funsym elp-master))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
468 (setq elp-record-p nil))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
469 result))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
470
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
471
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
472 ;; shut the byte-compiler up
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
473 (defvar elp-field-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
474 (defvar elp-cc-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
475 (defvar elp-at-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
476 (defvar elp-et-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 (defun elp-sort-by-call-count (vec1 vec2)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 ;; sort by highest call count. See `sort'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
480 (>= (aref vec1 0) (aref vec2 0)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 (defun elp-sort-by-total-time (vec1 vec2)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 ;; sort by highest total time spent in function. See `sort'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 (>= (aref vec1 1) (aref vec2 1)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 (defun elp-sort-by-average-time (vec1 vec2)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 ;; sort by highest average time spent in function. See `sort'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 (>= (aref vec1 2) (aref vec2 2)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
490 (defsubst elp-pack-number (number width)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
491 ;; pack the NUMBER string into WIDTH characters, watching out for
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
492 ;; very small or large numbers
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
493 (if (<= (length number) width)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
494 number
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
495 ;; check for very large or small numbers
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
496 (if (string-match "^\\(.*\\)\\(e[+-].*\\)$" number)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
497 (concat (substring
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
498 (match-string 1 number)
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
499 0
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
500 (- width (match-end 2) (- (match-beginning 2)) 3))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
501 "..."
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
502 (match-string 2 number))
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
503 (substring number 0 width))))
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
504
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
505 (defun elp-output-result (resultvec)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
506 ;; output the RESULTVEC into the results buffer. RESULTVEC is a 4 or
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507 ;; more element vector where aref 0 is the call count, aref 1 is the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
508 ;; total time spent in the function, aref 2 is the average time
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 ;; spent in the function, and aref 3 is the symbol's string
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 ;; name. All other elements in the vector are ignored.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 (let* ((cc (aref resultvec 0))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 (tt (aref resultvec 1))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 (at (aref resultvec 2))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 (symname (aref resultvec 3))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 callcnt totaltime avetime)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
516 (setq callcnt (number-to-string cc)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
517 totaltime (number-to-string tt)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
518 avetime (number-to-string at))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
519 ;; possibly prune the results
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
520 (if (and elp-report-limit
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
521 (numberp elp-report-limit)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
522 (< cc elp-report-limit))
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
523 nil
56711
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
524 (elp-output-insert-symname symname)
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
525 (insert-char 32 (+ elp-field-len (- (length symname)) 2))
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
526 ;; print stuff out, formatting it nicely
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
527 (insert callcnt)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
528 (insert-char 32 (+ elp-cc-len (- (length callcnt)) 2))
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
529 (let ((ttstr (elp-pack-number totaltime elp-et-len))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
530 (atstr (elp-pack-number avetime elp-at-len)))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
531 (insert ttstr)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
532 (insert-char 32 (+ elp-et-len (- (length ttstr)) 2))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
533 (insert atstr))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
534 (insert "\n"))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535
56711
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
536 (defvar elp-results-symname-map
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
537 (let ((map (make-sparse-keymap)))
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
538 (define-key map [mouse-2] 'elp-results-jump-to-definition)
56711
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
539 (define-key map "\C-m" 'elp-results-jump-to-definition)
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
540 map)
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
541 "Keymap used on the function name column." )
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
542
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
543 (defun elp-results-jump-to-definition (&optional event)
56711
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
544 "Jump to the definition of the function under the point."
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
545 (interactive (list last-nonmenu-event))
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
546 (if event (posn-set-point (event-end event)))
56711
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
547 (find-function (get-text-property (point) 'elp-symname)))
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
548
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
549 (defun elp-output-insert-symname (symname)
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
550 ;; Insert SYMNAME with text properties.
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
551 (insert (propertize symname
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
552 'elp-symname (intern symname)
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
553 'keymap elp-results-symname-map
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
554 'mouse-face 'highlight
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
555 'help-echo "mouse-2 or RET jumps to definition")))
56711
eee6cc3fe45e (elp-results-symname-map): New keymap.
Masatake YAMATO <jet@gyve.org>
parents: 52401
diff changeset
556
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
557 ;;;###autoload
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 (defun elp-results ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 "Display current profiling results.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 If `elp-reset-after-results' is non-nil, then current profiling
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 information for all instrumented functions are reset after results are
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 displayed."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 (interactive)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 (let ((curbuf (current-buffer))
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
565 (resultsbuf (if elp-recycle-buffers-p
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
566 (get-buffer-create elp-results-buffer)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
567 (generate-new-buffer elp-results-buffer))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 (set-buffer resultsbuf)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 (erase-buffer)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 ;; get the length of the longest function name being profiled
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 (let* ((longest 0)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 (title "Function Name")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 (titlelen (length title))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
574 (elp-field-len titlelen)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
575 (cc-header "Call Count")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
576 (elp-cc-len (length cc-header))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577 (et-header "Elapsed Time")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 (elp-et-len (length et-header))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 (at-header "Average Time")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580 (elp-at-len (length at-header))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 (resvec
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
582 (mapcar
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 (function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
584 (lambda (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
585 (let* ((info (get funsym elp-timer-info-property))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
586 (symname (format "%s" funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
587 (cc (aref info 0))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
588 (tt (aref info 1)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
589 (if (not info)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
590 (insert "No profiling information found for: "
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
591 symname)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
592 (setq longest (max longest (length symname)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
593 (vector cc tt (if (zerop cc)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
594 0.0 ;avoid arithmetic div-by-zero errors
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
595 (/ (float tt) (float cc)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
596 symname)))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
597 elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
598 ) ; end let*
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
599 (insert title)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
600 (if (> longest titlelen)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
601 (progn
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
602 (insert-char 32 (- longest titlelen))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
603 (setq elp-field-len longest)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
604 (insert " " cc-header " " et-header " " at-header "\n")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
605 (insert-char ?= elp-field-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
606 (insert " ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
607 (insert-char ?= elp-cc-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
608 (insert " ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
609 (insert-char ?= elp-et-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
610 (insert " ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
611 (insert-char ?= elp-at-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
612 (insert "\n")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
613 ;; if sorting is enabled, then sort the results list. in either
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
614 ;; case, call elp-output-result to output the result in the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
615 ;; buffer
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
616 (if elp-sort-by-function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
617 (setq resvec (sort resvec elp-sort-by-function)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
618 (mapcar 'elp-output-result resvec))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
619 ;; now pop up results buffer
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
620 (set-buffer curbuf)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
621 (pop-to-buffer resultsbuf)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
622 ;; copy results to standard-output?
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
623 (if (or elp-use-standard-output noninteractive)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
624 (princ (buffer-substring (point-min) (point-max))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
625 ;; reset profiling info if desired
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
626 (and elp-reset-after-results
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
627 (elp-reset-all))))
33095
ef9eb0f5f0b6 (elp-unload-hook): New function.
Dave Love <fx@gnu.org>
parents: 29245
diff changeset
628
ef9eb0f5f0b6 (elp-unload-hook): New function.
Dave Love <fx@gnu.org>
parents: 29245
diff changeset
629 (defun elp-unload-hook ()
ef9eb0f5f0b6 (elp-unload-hook): New function.
Dave Love <fx@gnu.org>
parents: 29245
diff changeset
630 (elp-restore-all))
57520
b7788b1f6e70 (elp-unload-hook): Set the variable.
Richard M. Stallman <rms@gnu.org>
parents: 56711
diff changeset
631 (add-hook 'elp-unload-hook 'elp-unload-hook)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
632
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
633 (provide 'elp)
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
634
67188
25c21897d6a9 (elp-not-profilable): Replace interactive-p with called-interactively-p.
Stefan Monnier <monnier@iro.umontreal.ca>
parents: 64751
diff changeset
635 ;; arch-tag: c4eef311-9b3e-4bb2-8a54-3485d41b4eb1
38414
67b464da13ec Some fixes to follow coding conventions.
Pavel Janík <Pavel@Janik.cz>
parents: 37785
diff changeset
636 ;;; elp.el ends here