Mercurial > emacs
changeset 8744:e1b824af0849
Update to 2.15.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 14 Sep 1994 20:21:36 +0000 |
parents | 03445a867bed |
children | ebbea7d79174 |
files | lisp/emacs-lisp/elp.el |
diffstat | 1 files changed, 77 insertions(+), 44 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/emacs-lisp/elp.el Wed Sep 14 19:32:18 1994 +0000 +++ b/lisp/emacs-lisp/elp.el Wed Sep 14 20:21:36 1994 +0000 @@ -1,34 +1,29 @@ ;;; elp.el --- Emacs Lisp Profiler +;; Copyright (C) 1994 Free Software Foundation, Inc. + ;; Author: 1994 Barry A. Warsaw, Century Computing, Inc. <bwarsaw@cen.com> ;; Maintainer: bwarsaw@cen.com ;; Created: 26-Feb-1994 -;; Version: 2.11 -;; Last Modified: 1994/06/06 22:38:07 +;; Version: 2.15 +;; Last Modified: 1994/07/05 13:46:02 ;; Keywords: Emacs Lisp Profile Timing -;; Copyright (C) 1994 Barry A. Warsaw +;; This file is part of GNU Emacs. -;; This file is not yet part of GNU Emacs. -;; -;; This program is free software; you can redistribute it and/or modify +;; GNU Emacs is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by -;; the Free Software Foundation; either version 2 of the License, or -;; (at your option) any later version. -;; -;; This program is distributed in the hope that it will be useful, +;; the Free Software Foundation; either version 2, or (at your option) +;; any later version. + +;; GNU Emacs is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. -;; + ;; You should have received a copy of the GNU General Public License -;; along with this program; if not, write to the Free Software -;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - -;; LCD Archive Entry: -;; elp|Barry A. Warsaw|tools-help@anthem.nlm.nih.gov| -;; Emacs Lisp Profiler| -;; 1994/06/06 22:38:07|2.11|~/misc/elp.el.Z| +;; along with GNU Emacs; see the file COPYING. If not, write to +;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. ;;; Commentary: ;; @@ -37,7 +32,7 @@ ;; profiler.el. Both were written for Emacs 18 and both were pretty ;; good first shots at profiling, but I found that they didn't provide ;; the functionality or interface that I wanted. So I wrote this. -;; I've tested elp in Lucid Emacs 19.9 and in Emacs 19.22. There's no +;; I've tested elp in Lucid Emacs 19.9 and Emacs 19.22. There's no ;; point in even trying to make this work with Emacs 18. ;; Unlike previous profilers, elp uses Emacs 19's built-in function @@ -67,6 +62,7 @@ ;; elp-restore-function ;; elp-instrument-list ;; elp-restore-list +;; elp-instrument-package ;; elp-restore-all ;; elp-reset-function ;; elp-reset-list @@ -80,21 +76,28 @@ ;; information is recorded whenever they are called. To print out the ;; current results, use elp-results. With elp-reset-after-results set ;; to non-nil, profiling information will be reset whenever the -;; results are displayed, but you can reset all profiling info with -;; elp-reset-all. +;; results are displayed. You can also reset all profiling info at any +;; time with elp-reset-all. +;; +;; You can also instrument all functions in a package, provided that +;; the package follows the GNU coding standard of a common textural +;; prefix. elp-instrument-package does this. ;; ;; If you want to sort the results, set elp-sort-by-function to some ;; predicate function. The three most obvious choices are predefined: ;; elp-sort-by-call-count, elp-sort-by-average-time, and -;; elp-sort-by-total-time. +;; elp-sort-by-total-time. Also, you can prune from the output +;; display, all functions that have been called fewer than a given +;; number of times by setting elp-report-limit to that number. ;; ;; Elp can instrument byte-compiled functions just as easily as -;; interpreted functions. However, when you redefine a function (e.g. -;; with eval-defun), you'll need to re-instrument it with -;; elp-instrument-function. Re-instrumenting resets profiling -;; information for that function. Elp can also handle interactive -;; functions (i.e. commands), but of course any time spent idling for -;; user prompts will show up in the timing results. +;; interpreted functions, but it cannot instrument macros. However, +;; when you redefine a function (e.g. with eval-defun), you'll need +;; to re-instrument it with elp-instrument-function. Re-instrumenting +;; resets profiling information for that function. Elp can also +;; handle interactive functions (i.e. commands), but of course any +;; time spent idling for user prompts will show up in the timing +;; results. ;; ;; You can also designate a `master' function. Profiling times will ;; be gathered for instrumented functions only during execution of @@ -142,12 +145,18 @@ element 2 is the average time spent in the function, and element 3 is the symbol's name string.") +(defvar elp-report-limit nil + "*Prevents some functions from being displayed in the results buffer. +If a number, no function that has been called fewer than that number +of times will be displayed in the output buffer. If nil, all +functions will be displayed.") + ;; ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; end user configuration variables -(defconst elp-version "2.11" +(defconst elp-version "2.15" "ELP version number.") (defconst elp-help-address "tools-help@anthem.nlm.nih.gov" @@ -178,6 +187,9 @@ (let* ((funguts (symbol-function funsym)) (infovec (vector 0 0 funguts)) (newguts '(lambda (&rest args)))) + ;; we cannot profile macros + (and (eq (car-safe funguts) 'macro) + (error "ELP cannot profile macro %s" funsym)) ;; put rest of newguts together (if (commandp funsym) (setq newguts (append newguts '((interactive))))) @@ -256,6 +268,21 @@ (let ((list (or list elp-function-list))) (mapcar 'elp-instrument-function list))) +(defun elp-instrument-package (prefix) + "Instrument for profiling, all functions which start with PREFIX. +For example, to instrument all ELP functions, do the following: + + \\[elp-instrument-package] RET elp- RET" + (interactive "sPrefix of package to instrument: ") + (elp-instrument-list + (mapcar 'intern (all-completions prefix obarray + (function + (lambda (sym) + (and (fboundp sym) + (not (eq (car-safe + (symbol-function sym)) + 'macro))))))))) + (defun elp-restore-list (&optional list) "Restore the original definitions for all functions in `elp-function-list'. Use optional LIST if provided instead." @@ -388,22 +415,27 @@ (at (aref resultvec 2)) (symname (aref resultvec 3)) callcnt totaltime avetime) - (insert symname) - (insert-char 32 (+ elp-field-len (- (length symname)) 2)) (setq callcnt (number-to-string cc) totaltime (number-to-string tt) avetime (number-to-string at)) - ;; print stuff out, formatting it nicely - (insert callcnt) - (insert-char 32 (+ elp-cc-len (- (length callcnt)) 2)) - (if (> (length totaltime) elp-et-len) - (insert (substring totaltime 0 elp-et-len) " ") - (insert totaltime) - (insert-char 32 (+ elp-et-len (- (length totaltime)) 2))) - (if (> (length avetime) elp-at-len) - (insert (substring avetime 0 elp-at-len)) - (insert avetime)) - (insert "\n"))) + ;; possibly prune the results + (if (and elp-report-limit + (numberp elp-report-limit) + (< cc elp-report-limit)) + nil + (insert symname) + (insert-char 32 (+ elp-field-len (- (length symname)) 2)) + ;; print stuff out, formatting it nicely + (insert callcnt) + (insert-char 32 (+ elp-cc-len (- (length callcnt)) 2)) + (if (> (length totaltime) elp-et-len) + (insert (substring totaltime 0 elp-et-len) " ") + (insert totaltime) + (insert-char 32 (+ elp-et-len (- (length totaltime)) 2))) + (if (> (length avetime) elp-at-len) + (insert (substring avetime 0 elp-at-len)) + (insert avetime)) + (insert "\n")))) (defun elp-results () "Display current profiling results. @@ -484,10 +516,11 @@ (require 'reporter) (reporter-submit-bug-report elp-help-address (concat "elp " elp-version) - '(elp-reset-after-results + '(elp-report-limit + elp-reset-after-results elp-sort-by-function)))) (provide 'elp) + ;; elp.el ends here -