Add new macro `benchmark-progn'
* doc/lispref/debugging.texi (Profiling): Mention it. * lisp/emacs-lisp/benchmark.el (benchmark-progn): New macro.
This commit is contained in:
parent
7acc621e37
commit
ddc9837bf4
3 changed files with 33 additions and 3 deletions
|
@ -1041,9 +1041,9 @@ functions written in Lisp, it cannot profile Emacs primitives.
|
||||||
@cindex benchmarking
|
@cindex benchmarking
|
||||||
You can measure the time it takes to evaluate individual Emacs Lisp
|
You can measure the time it takes to evaluate individual Emacs Lisp
|
||||||
forms using the @file{benchmark} library. See the macros
|
forms using the @file{benchmark} library. See the macros
|
||||||
@code{benchmark-run} and @code{benchmark-run-compiled} in
|
@code{benchmark-run}, @code{benchmark-run-compiled} and
|
||||||
@file{benchmark.el}. You can also use the @code{benchmark} command
|
@code{benchmark-progn} in @file{benchmark.el}. You can also use the
|
||||||
for timing forms interactively.
|
@code{benchmark} command for timing forms interactively.
|
||||||
|
|
||||||
@c Not worth putting in the printed manual.
|
@c Not worth putting in the printed manual.
|
||||||
@ifnottex
|
@ifnottex
|
||||||
|
|
6
etc/NEWS
6
etc/NEWS
|
@ -2399,6 +2399,12 @@ scrolling.
|
||||||
|
|
||||||
* Lisp Changes in Emacs 27.1
|
* Lisp Changes in Emacs 27.1
|
||||||
|
|
||||||
|
+++
|
||||||
|
** New macro 'benchmark-progn'
|
||||||
|
This macro works like 'progn', but messages how long it takes to
|
||||||
|
evaluate the body forms. The value of the last form is the return
|
||||||
|
value.
|
||||||
|
|
||||||
** New function 'read-char-with-history'.
|
** New function 'read-char-with-history'.
|
||||||
This function works like 'read-char', but maintains a history that can
|
This function works like 'read-char', but maintains a history that can
|
||||||
be navigated via the 'M-p'/'M-n' keystrokes.
|
be navigated via the 'M-p'/'M-n' keystrokes.
|
||||||
|
|
|
@ -107,6 +107,30 @@ For non-interactive use see also `benchmark-run' and
|
||||||
(message "Elapsed time: %fs (%fs in %d GCs)" (car result)
|
(message "Elapsed time: %fs (%fs in %d GCs)" (car result)
|
||||||
(nth 2 result) (nth 1 result)))))
|
(nth 2 result) (nth 1 result)))))
|
||||||
|
|
||||||
|
;;;###autoload
|
||||||
|
(defmacro benchmark-progn (&rest body)
|
||||||
|
"Evaluate BODY and message the time taken.
|
||||||
|
The return value is the value of the final form in BODY."
|
||||||
|
(declare (debug body) (indent 0))
|
||||||
|
(let ((value (make-symbol "value"))
|
||||||
|
(start (make-symbol "start"))
|
||||||
|
(gcs (make-symbol "gcs"))
|
||||||
|
(gc (make-symbol "gc")))
|
||||||
|
`(let ((,gc gc-elapsed)
|
||||||
|
(,gcs gcs-done)
|
||||||
|
(,start (current-time))
|
||||||
|
(,value (progn
|
||||||
|
,@body)))
|
||||||
|
(message "Elapsed time: %fs%s"
|
||||||
|
(float-time (time-since ,start))
|
||||||
|
(if (> (- gcs-done ,gcs) 0)
|
||||||
|
(format " (%fs in %d GCs)"
|
||||||
|
(- gc-elapsed ,gc)
|
||||||
|
(- gcs-done ,gcs))
|
||||||
|
""))
|
||||||
|
;; Return the value of the body.
|
||||||
|
,value)))
|
||||||
|
|
||||||
(provide 'benchmark)
|
(provide 'benchmark)
|
||||||
|
|
||||||
;;; benchmark.el ends here
|
;;; benchmark.el ends here
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue