annotate lisp/emacs-lisp/elp.el @ 30408:e3e2c9051c5f

Got rid of all byte-compiler warnings on Emacs. Add to the menu when the file is loaded, not in ada-mode-hook. Add -toolbar to the default ddd command Switches moved from ada-prj-default-comp-cmd and ada-prj-default-make-cmd to ada-prj-default-comp-opt (ada-add-ada-menu): Remove the map and name parameters Add the Ada Reference Manual to the menu (ada-check-current): rewritten as a call to ada-compile-current (ada-compile): Removed. (ada-compile-application, ada-compile-current, ada-check-current): Set the compilation-search-path so that compile.el automatically finds the sources in src_dir. Automatic scrollong of the compilation buffer. C-uC-cC-c asks for confirmation before compiling (ada-compile-current): New parameter, prj-field (ada-complete-identifier): Load the .ali file before doing processing (ada-find-ali-file-in-dir): prepend build_dir to obj_dir to conform to gnatmake's behavior. (ada-find-file-in-dir): New function (ada-find-references): Set the environment variables for gnatfind (ada-find-src-file-in-dir): New function. (ada-first-non-nil): Removed (ada-gdb-application): Add support for jdb, the java debugger. (ada-get-ada-file-name): Load the original-file first if not done yet. (ada-get-all-references): Handles the new ali syntax (parent types are found between <>). (ada-initialize-runtime-library): New function (ada-mode-hook): Always load a project file when a file is opened, so that the casing exceptions are correctly read. (ada-operator-re): Add all missing operators ("abs", "rem", "**"). (ada-parse-prj-file): Use find-file-noselect instead of find-file to open the project file, since the latter does not work with speedbar Get default values before loading the prj file, or the default executable file name is wrong. Use the absolute value of src_dir to initialize ada-search-directories and compilation-search-path,... Add the standard runtime library to the search path for find-file. (ada-prj-default-debugger): Was missing an opening '{' (ada-prj-default-bind-opt, ada-prj-default-link-opt): New variables. (ada-prj-default-gnatmake-opt): New variable (ada-prj-find-prj-file): Handles non-file buffers For non-Ada buffers, the project file is the default one Save the windows configuration before displaying the menu. (ada-prj-src-dir, ada-prj-obj-dir, ada-prj-comp-opt,...): Removed (ada-read-identifier): Fix xrefs on operators (for "mod", "and", ...) regexp-quote identifiers names to support operators +, -,... in regexps. (ada-remote): New function. (ada-run-application): Erase the output buffer before starting the run Support remote execution of the application. Use call-process, or the arguments are incorrectly parsed (ada-set-default-project-file): Reread the content of the active project file, not the one from the current buffer When a project file is set as the default project, all directories are automatically associated with it. (ada-set-environment): New function (ada-treat-cmd-string): New special variable ${current} (ada-treat-cmd-string): Revised. The substitution is now done for any ${...} substring (ada-xref-current): If no body was found, compiles the spec instead. Setup ADA_{SOURCE,OBJECTS}_PATH before running the compiler to get rid of command line length limitations. (ada-xref-get-project-field): New function (ada-xref-project-files): New variable (ada-xref-runtime-library-specs-path) (ada-xref-runtime-library-ali-path): New variables (ada-xref-set-default-prj-values): Default run command now does a cd to the build directory. New field: main_unit Provide a default file name even if the current buffer has no prj file.
author Gerd Moellmann <gerd@gnu.org>
date Mon, 24 Jul 2000 11:13:11 +0000
parents 5e197bc49066
children ef9eb0f5f0b6
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
21172
f9887487a4a1 Change comment and version numbers.
Richard M. Stallman <rms@gnu.org>
parents: 18064
diff changeset
3 ;; Copyright (C) 1994,1995,1997,1998 Free Software Foundation, Inc.
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
4
21172
f9887487a4a1 Change comment and version numbers.
Richard M. Stallman <rms@gnu.org>
parents: 18064
diff changeset
5 ;; Author: 1994-1998 Barry A. Warsaw
29236
5e8d0b640d69 Change maintainer to FSF.
Dave Love <fx@gnu.org>
parents: 29211
diff changeset
6 ;; Maintainer: FSF
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
7 ;; Created: 26-Feb-1994
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
8 ;; Keywords: debugging lisp tools
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
9
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
10 ;; This file is part of GNU Emacs.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
11
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
12 ;; 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
13 ;; 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
14 ;; 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
15 ;; any later version.
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
16
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
17 ;; 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
18 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
19 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
20 ;; GNU General Public License for more details.
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
21
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
22 ;; 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
23 ;; along with GNU Emacs; see the file COPYING. If not, write to the
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 10280
diff changeset
24 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330,
83f275dcd93a Update FSF's address.
Erik Naggum <erik@naggum.no>
parents: 10280
diff changeset
25 ;; Boston, MA 02111-1307, USA.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
26
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
27 ;;; Commentary:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
28 ;;
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
29 ;; 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
30 ;; 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
31 ;; hacks those functions so that profiling information is recorded
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
32 ;; 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
33 ;; 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
34 ;; 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
35 ;; 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
36 ;; 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
37 ;; 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
38 ;; elp-reset-all.
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
39 ;;
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
40 ;; You can also instrument all functions in a package, provided that
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
41 ;; the package follows the GNU coding standard of a common textural
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
42 ;; prefix. Use M-x elp-instrument-package for this.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
43 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
44 ;; 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
45 ;; predicate function. The three most obvious choices are predefined:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
46 ;; 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
47 ;; 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
48 ;; 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
49 ;; by setting elp-report-limit.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
50 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
51 ;; 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
52 ;; 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
53 ;; 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
54 ;; 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
55 ;; reset profiling information for that function. Elp can handle
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
56 ;; interactive functions (i.e. commands), but of course any time spent
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
57 ;; idling for user prompts will show up in the timing results.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
58 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
59 ;; You can also designate a `master' function. Profiling times will
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
60 ;; be gathered for instrumented functions only during execution of
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
61 ;; this master function. Thus, if you have some defuns like:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
62 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
63 ;; (defun foo () (do-something-time-intensive))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
64 ;; (defun bar () (foo))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
65 ;; (defun baz () (bar) (foo))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
66 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
67 ;; 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
68 ;; 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
69 ;; 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
70 ;; 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
71 ;; Only one master function can be set at a time.
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
72
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
73 ;; You can restore any function's original function definition with
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
74 ;; elp-restore-function. The other instrument, restore, and reset
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
75 ;; functions are provided for symmetry.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
76
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
77 ;; 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
78 ;; elp-function-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
79 ;; elp-reset-after-results
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
80 ;; elp-sort-by-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
81 ;; elp-report-limit
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
82 ;;
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
83 ;; Here is a list of the interactive commands you can use:
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
84 ;; elp-instrument-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
85 ;; elp-restore-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
86 ;; elp-instrument-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
87 ;; elp-restore-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
88 ;; elp-instrument-package
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
89 ;; elp-restore-all
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
90 ;; elp-reset-function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
91 ;; elp-reset-list
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
92 ;; elp-reset-all
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
93 ;; elp-set-master
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
94 ;; elp-unset-master
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
95 ;; elp-results
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
96
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
97 ;; 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
98 ;; reported unreliable, including the accuracy and granularity of your
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
99 ;; system clock, and the overhead spent in lisp calculating and
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
100 ;; recording the intervals. I figure the latter is pretty constant,
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
101 ;; 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
102 ;; 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
103 ;; various lisp routines you are profiling. Note further that times
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
104 ;; 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
105 ;; affect accuracy too.
10280
ba09e85fa992 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10263
diff changeset
106
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
107 ;;; Background:
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
108
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
109 ;; 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
110 ;; 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
111 ;; 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
112 ;; 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
113 ;; 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
114 ;; 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
115 ;; in even trying to make this work with Emacs 18.
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
116
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
117 ;; Unlike previous profilers, elp uses Emacs 19's built-in function
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
118 ;; current-time to return interval times. This obviates the need for
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
119 ;; 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
120 ;; 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
121
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
122 ;; TBD:
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
123 ;; 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
124 ;; in all branches of execution.
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
125
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
126 ;;; Code:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
127
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
128
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
129 ;; start of user configuration variables
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
130 ;; vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
131
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
132 (defgroup elp nil
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
133 "Emacs Lisp Profiler"
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
134 :group 'lisp)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
135
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
136 (defcustom elp-function-list nil
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
137 "*List of functions to profile.
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
138 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
139 :type '(repeat function)
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
140 :group 'elp)
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
141
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
142 (defcustom elp-reset-after-results t
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
143 "*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
144 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
145 :type 'boolean
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
146 :group 'elp)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
147
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
148 (defcustom elp-sort-by-function 'elp-sort-by-total-time
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
149 "*Non-nil specifies elp results sorting function.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
150 These functions are currently available:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
151
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
152 elp-sort-by-call-count -- sort by the highest call count
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
153 elp-sort-by-total-time -- sort by the highest total time
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
154 elp-sort-by-average-time -- sort by the highest average times
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
155
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
156 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
157 interface specified by the PRED argument for the `sort' defun. Each
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
158 \"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
159 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
160 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
161 the symbol's name string."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
162 :type 'function
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
163 :group 'elp)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
164
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
165 (defcustom elp-report-limit 1
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
166 "*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
167 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
168 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
169 functions will be displayed."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
170 :type '(choice integer
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
171 (const :tag "Show All" nil))
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
172 :group 'elp)
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
173
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
174 (defcustom elp-use-standard-output nil
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
175 "*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
176 :type 'boolean
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
177 :group 'elp)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
178
17423
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
179 (defcustom elp-recycle-buffers-p t
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
180 "*Nil says to not recycle the `elp-results-buffer'.
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
181 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
182 \\[elp-results]."
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
183 :type 'boolean
43e483167dd3 Add defgroup; use defcustom for user vars.
Richard M. Stallman <rms@gnu.org>
parents: 17420
diff changeset
184 :group 'elp)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
185
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
186
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
187 ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
188 ;; end of user configuration variables
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
189
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 (defvar elp-results-buffer "*ELP Profiling Results*"
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
192 "Buffer name for outputting profiling results.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
193
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
194 (defconst elp-timer-info-property 'elp-info
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
195 "ELP information property name.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
196
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
197 (defvar elp-all-instrumented-list nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
198 "List of all functions currently being instrumented.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
199
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
200 (defvar elp-record-p t
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
201 "Controls whether functions should record times or not.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
202 This variable is set by the master function.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
203
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
204 (defvar elp-master nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
205 "Master function symbol.")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
206
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
207
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
208 ;;;###autoload
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
209 (defun elp-instrument-function (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
210 "Instrument FUNSYM for profiling.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
211 FUNSYM must be a symbol of a defined function."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
212 (interactive "aFunction to instrument: ")
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
213 ;; restore the function. this is necessary to avoid infinite
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
214 ;; recursion of already instrumented functions (i.e. elp-wrapper
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
215 ;; 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
216 ;; 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
217 ;; 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
218 ;; 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
219 ;; 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
220 ;; definition.
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
221 (elp-restore-function funsym)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
222 (let* ((funguts (symbol-function funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
223 (infovec (vector 0 0 funguts))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
224 (newguts '(lambda (&rest args))))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
225 ;; we cannot profile macros
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
226 (and (eq (car-safe funguts) 'macro)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
227 (error "ELP cannot profile macro: %s" funsym))
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
228 ;; 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
229 ;; 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
230 ;; 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
231 ;; 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
232 ;; 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
233 ;; 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
234 ;; 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
235 (and (eq (car-safe funguts) 'autoload)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
236 (error "ELP cannot profile autoloaded function: %s" funsym))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
237 ;; put rest of newguts together
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
238 (if (commandp funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
239 (setq newguts (append newguts '((interactive)))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
240 (setq newguts (append newguts (list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
241 (list 'elp-wrapper
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
242 (list 'quote funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
243 (list 'and
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
244 '(interactive-p)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
245 (not (not (commandp funsym))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
246 'args))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
247 ;; to record profiling times, we set the symbol's function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
248 ;; definition so that it runs the elp-wrapper function with the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
249 ;; function symbol as an argument. We place the old function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
250 ;; definition on the info vector.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
251 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
252 ;; The info vector data structure is a 3 element vector. The 0th
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
253 ;; 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
254 ;; function has been entered. This value is bumped up on entry to
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
255 ;; the function so that non-local exists are still recorded. TBD:
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
256 ;; I haven't tested non-local exits at all, so no guarantees.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
257 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
258 ;; 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
259 ;; been spent inside this function. This number is added to on
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
260 ;; function exit.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
261 ;;
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
262 ;; The 2nd element is the old function definition list. This gets
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
263 ;; funcall'd in between start/end time retrievals. I believe that
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
264 ;; this lets us profile even byte-compiled functions.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
265
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
266 ;; put the info vector on the property list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
267 (put funsym elp-timer-info-property infovec)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
268
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
269 ;; set the symbol's new profiling function definition to run
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
270 ;; elp-wrapper
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
271 (fset funsym newguts)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
272
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
273 ;; add this function to the instrumentation list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
274 (or (memq funsym elp-all-instrumented-list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
275 (setq elp-all-instrumented-list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
276 (cons funsym elp-all-instrumented-list)))
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
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
279 ;;;###autoload
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
280 (defun elp-restore-function (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
281 "Restore an instrumented function to its original definition.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
282 Argument FUNSYM is the symbol of a defined function."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
283 (interactive "aFunction to restore: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
284 (let ((info (get funsym elp-timer-info-property)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
285 ;; delete the function from the all instrumented list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
286 (setq elp-all-instrumented-list
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
287 (delq funsym elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
288
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
289 ;; if the function was the master, reset the master
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
290 (if (eq funsym elp-master)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
291 (setq elp-master nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
292 elp-record-p t))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
293
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
294 ;; zap the properties
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
295 (put funsym elp-timer-info-property nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
296
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
297 ;; restore the original function definition, but if the function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
298 ;; wasn't instrumented do nothing. we do this after the above
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
299 ;; because its possible the function got un-instrumented due to
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
300 ;; circumstances beyond our control. Also, check to make sure
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
301 ;; 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
302 ;; 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
303 ;; byte-compiled version, while the function was instrumented and
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
304 ;; 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
305 ;; the case that a lisp function can be compiled instrumented?
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
306 (and info
17420
782c3dac70b1 (elp-functionp): Definitions deleted; use functionp.
Richard M. Stallman <rms@gnu.org>
parents: 17419
diff changeset
307 (functionp funsym)
29211
88e33ac31c14 (elp-restore-function): Don't use obsolete byte-code-function-p.
Dave Love <fx@gnu.org>
parents: 21172
diff changeset
308 (not (byte-code-function-p (symbol-function funsym)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
309 (assq 'elp-wrapper (symbol-function funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
310 (fset funsym (aref info 2)))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
311
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
312 ;;;###autoload
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
313 (defun elp-instrument-list (&optional list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
314 "Instrument for profiling, all functions in `elp-function-list'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
315 Use optional LIST if provided instead."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
316 (interactive "PList of functions to instrument: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
317 (let ((list (or list elp-function-list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
318 (mapcar 'elp-instrument-function list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
319
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
320 ;;;###autoload
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
321 (defun elp-instrument-package (prefix)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
322 "Instrument for profiling, all functions which start with PREFIX.
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
323 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
324
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
325 \\[elp-instrument-package] RET elp- RET"
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
326 (interactive "sPrefix of package to instrument: ")
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
327 (elp-instrument-list
17527
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
328 (mapcar
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
329 'intern
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
330 (all-completions
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
331 prefix obarray
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
332 (function
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
333 (lambda (sym)
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
334 (and (fboundp sym)
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
335 (not (memq (car-safe (symbol-function sym)) '(autoload macro))))
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
336 ))
2f06477dce5d (elp-report-limit): Change prompt string.
Richard M. Stallman <rms@gnu.org>
parents: 17424
diff changeset
337 ))))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
338
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
339 (defun elp-restore-list (&optional list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
340 "Restore the original definitions for all functions in `elp-function-list'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
341 Use optional LIST if provided instead."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
342 (interactive "PList of functions to restore: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
343 (let ((list (or list elp-function-list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
344 (mapcar 'elp-restore-function list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
345
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
346 (defun elp-restore-all ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
347 "Restores the original definitions of all functions being profiled."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
348 (interactive)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
349 (elp-restore-list elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
350
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
351
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
352 (defun elp-reset-function (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
353 "Reset the profiling information for FUNSYM."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
354 (interactive "aFunction to reset: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
355 (let ((info (get funsym elp-timer-info-property)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
356 (or info
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
357 (error "%s is not instrumented for profiling." funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
358 (aset info 0 0) ;reset call counter
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
359 (aset info 1 0.0) ;reset total time
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
360 ;; 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
361 ))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
362
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
363 (defun elp-reset-list (&optional list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
364 "Reset the profiling information for all functions in `elp-function-list'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
365 Use optional LIST if provided instead."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
366 (interactive "PList of functions to reset: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
367 (let ((list (or list elp-function-list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
368 (mapcar 'elp-reset-function list)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
369
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
370 (defun elp-reset-all ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
371 "Reset the profiling information for all functions being profiled."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
372 (interactive)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
373 (elp-reset-list elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
374
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
375 (defun elp-set-master (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
376 "Set the master function for profiling."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
377 (interactive "aMaster function: ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
378 ;; when there's a master function, recording is turned off by
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
379 ;; default
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
380 (setq elp-master funsym
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
381 elp-record-p nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
382 ;; make sure master function is instrumented
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
383 (or (memq funsym elp-all-instrumented-list)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
384 (elp-instrument-function funsym)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
385
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
386 (defun elp-unset-master ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
387 "Unsets the master function."
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
388 (interactive)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
389 ;; when there's no master function, recording is turned on by default.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
390 (setq elp-master nil
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
391 elp-record-p t))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
392
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
393
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
394 (defsubst elp-elapsed-time (start end)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
395 (+ (* (- (car end) (car start)) 65536.0)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
396 (- (car (cdr end)) (car (cdr start)))
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
397 (/ (- (car (cdr (cdr end))) (car (cdr (cdr start)))) 1000000.0)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
398
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
399 (defun elp-wrapper (funsym interactive-p args)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
400 "This function has been instrumented for profiling by the ELP.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
401 ELP is the Emacs Lisp Profiler. To restore the function to its
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
402 original definition, use \\[elp-restore-function] or \\[elp-restore-all]."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
403 ;; turn on recording if this is the master function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
404 (if (and elp-master
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
405 (eq funsym elp-master))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
406 (setq elp-record-p t))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
407 ;; get info vector and original function symbol
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
408 (let* ((info (get funsym elp-timer-info-property))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
409 (func (aref info 2))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
410 result)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
411 (or func
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
412 (error "%s is not instrumented for profiling." funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
413 (if (not elp-record-p)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
414 ;; when not recording, just call the original function symbol
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
415 ;; and return the results.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
416 (setq result
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
417 (if interactive-p
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
418 (call-interactively func)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
419 (apply func args)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
420 ;; we are recording times
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
421 (let (enter-time exit-time)
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
422 ;; increment the call-counter
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
423 (aset info 0 (1+ (aref info 0)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
424 ;; now call the old symbol function, checking to see if it
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
425 ;; should be called interactively. make sure we return the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
426 ;; correct value
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
427 (if interactive-p
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
428 (setq enter-time (current-time)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
429 result (call-interactively func)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
430 exit-time (current-time))
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
431 (setq enter-time (current-time)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
432 result (apply func args)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
433 exit-time (current-time)))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
434 ;; calculate total time in function
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
435 (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
436 ))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
437 ;; turn off recording if this is the master function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
438 (if (and elp-master
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
439 (eq funsym elp-master))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
440 (setq elp-record-p nil))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
441 result))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
442
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
443
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
444 ;; shut the byte-compiler up
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
445 (defvar elp-field-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
446 (defvar elp-cc-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
447 (defvar elp-at-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
448 (defvar elp-et-len nil)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
449
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
450 (defun elp-sort-by-call-count (vec1 vec2)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
451 ;; sort by highest call count. See `sort'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
452 (>= (aref vec1 0) (aref vec2 0)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
453
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
454 (defun elp-sort-by-total-time (vec1 vec2)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
455 ;; sort by highest total time spent in function. See `sort'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
456 (>= (aref vec1 1) (aref vec2 1)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
457
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
458 (defun elp-sort-by-average-time (vec1 vec2)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
459 ;; sort by highest average time spent in function. See `sort'.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
460 (>= (aref vec1 2) (aref vec2 2)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
461
10234
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
462 (defsubst elp-pack-number (number width)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
463 ;; 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
464 ;; very small or large numbers
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
465 (if (<= (length number) width)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
466 number
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
467 ;; check for very large or small numbers
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
468 (if (string-match "^\\(.*\\)\\(e[+-].*\\)$" number)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
469 (concat (substring
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
470 (substring number (match-beginning 1) (match-end 1))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
471 0
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
472 (- width (match-end 2) (- (match-beginning 2)) 3))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
473 "..."
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
474 (substring number (match-beginning 2) (match-end 2)))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
475 (concat (substring number 0 width)))))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
476
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
477 (defun elp-output-result (resultvec)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
478 ;; output the RESULTVEC into the results buffer. RESULTVEC is a 4 or
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
479 ;; 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
480 ;; total time spent in the function, aref 2 is the average time
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
481 ;; spent in the function, and aref 3 is the symbol's string
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
482 ;; name. All other elements in the vector are ignored.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
483 (let* ((cc (aref resultvec 0))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
484 (tt (aref resultvec 1))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
485 (at (aref resultvec 2))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
486 (symname (aref resultvec 3))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
487 callcnt totaltime avetime)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
488 (setq callcnt (number-to-string cc)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
489 totaltime (number-to-string tt)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
490 avetime (number-to-string at))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
491 ;; possibly prune the results
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
492 (if (and elp-report-limit
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
493 (numberp elp-report-limit)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
494 (< cc elp-report-limit))
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
495 nil
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
496 (insert symname)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
497 (insert-char 32 (+ elp-field-len (- (length symname)) 2))
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
498 ;; print stuff out, formatting it nicely
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
499 (insert callcnt)
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
500 (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
501 (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
502 (atstr (elp-pack-number avetime elp-at-len)))
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
503 (insert ttstr)
170c4c188d4f (elp-pack-number): New function.
Richard M. Stallman <rms@gnu.org>
parents: 8745
diff changeset
504 (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
505 (insert atstr))
8744
e1b824af0849 Update to 2.15.
Richard M. Stallman <rms@gnu.org>
parents: 8735
diff changeset
506 (insert "\n"))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
507
8745
ebbea7d79174 Add autoloads.
Richard M. Stallman <rms@gnu.org>
parents: 8744
diff changeset
508 ;;;###autoload
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
509 (defun elp-results ()
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
510 "Display current profiling results.
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
511 If `elp-reset-after-results' is non-nil, then current profiling
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
512 information for all instrumented functions are reset after results are
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
513 displayed."
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
514 (interactive)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
515 (let ((curbuf (current-buffer))
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
516 (resultsbuf (if elp-recycle-buffers-p
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
517 (get-buffer-create elp-results-buffer)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
518 (generate-new-buffer elp-results-buffer))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
519 (set-buffer resultsbuf)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
520 (erase-buffer)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
521 (beginning-of-buffer)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
522 ;; get the length of the longest function name being profiled
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
523 (let* ((longest 0)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
524 (title "Function Name")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
525 (titlelen (length title))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
526 (elp-field-len titlelen)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
527 (cc-header "Call Count")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
528 (elp-cc-len (length cc-header))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
529 (et-header "Elapsed Time")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
530 (elp-et-len (length et-header))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
531 (at-header "Average Time")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
532 (elp-at-len (length at-header))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
533 (resvec
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
534 (mapcar
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
535 (function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
536 (lambda (funsym)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
537 (let* ((info (get funsym elp-timer-info-property))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
538 (symname (format "%s" funsym))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
539 (cc (aref info 0))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
540 (tt (aref info 1)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
541 (if (not info)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
542 (insert "No profiling information found for: "
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
543 symname)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
544 (setq longest (max longest (length symname)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
545 (vector cc tt (if (zerop cc)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
546 0.0 ;avoid arithmetic div-by-zero errors
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
547 (/ (float tt) (float cc)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
548 symname)))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
549 elp-all-instrumented-list))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
550 ) ; end let*
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
551 (insert title)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
552 (if (> longest titlelen)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
553 (progn
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
554 (insert-char 32 (- longest titlelen))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
555 (setq elp-field-len longest)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
556 (insert " " cc-header " " et-header " " at-header "\n")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
557 (insert-char ?= elp-field-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
558 (insert " ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
559 (insert-char ?= elp-cc-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
560 (insert " ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
561 (insert-char ?= elp-et-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
562 (insert " ")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
563 (insert-char ?= elp-at-len)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
564 (insert "\n")
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
565 ;; if sorting is enabled, then sort the results list. in either
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
566 ;; case, call elp-output-result to output the result in the
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
567 ;; buffer
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
568 (if elp-sort-by-function
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
569 (setq resvec (sort resvec elp-sort-by-function)))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
570 (mapcar 'elp-output-result resvec))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
571 ;; now pop up results buffer
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
572 (set-buffer curbuf)
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
573 (pop-to-buffer resultsbuf)
17419
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
574 ;; copy results to standard-output?
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
575 (if (or elp-use-standard-output noninteractive)
c9f73399244c (elp-functionp): New function.
Richard M. Stallman <rms@gnu.org>
parents: 14858
diff changeset
576 (princ (buffer-substring (point-min) (point-max))))
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
577 ;; reset profiling info if desired
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
578 (and elp-reset-after-results
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
579 (elp-reset-all))))
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
580
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
581 (provide 'elp)
10263
525b67bc4f17 Comment changes.
Richard M. Stallman <rms@gnu.org>
parents: 10234
diff changeset
582
8735
d1f0811de024 Initial revision
Richard M. Stallman <rms@gnu.org>
parents:
diff changeset
583 ;; elp.el ends here