]> git.eshelyaron.com Git - emacs.git/commitdiff
Add new macro `benchmark-progn'
authorLars Ingebrigtsen <larsi@gnus.org>
Tue, 15 Oct 2019 06:19:08 +0000 (08:19 +0200)
committerLars Ingebrigtsen <larsi@gnus.org>
Tue, 15 Oct 2019 06:19:14 +0000 (08:19 +0200)
* doc/lispref/debugging.texi (Profiling): Mention it.

* lisp/emacs-lisp/benchmark.el (benchmark-progn): New macro.

doc/lispref/debugging.texi
etc/NEWS
lisp/emacs-lisp/benchmark.el

index 71e767d0a66fd53e52a2284bbab5e84b45c25d24..b7eca1e50f8d073ba21a038872bcff1fd89205eb 100644 (file)
@@ -1041,9 +1041,9 @@ functions written in Lisp, it cannot profile Emacs primitives.
 @cindex benchmarking
 You can measure the time it takes to evaluate individual Emacs Lisp
 forms using the @file{benchmark} library.  See the macros
-@code{benchmark-run} and @code{benchmark-run-compiled} in
-@file{benchmark.el}.  You can also use the @code{benchmark} command
-for timing forms interactively.
+@code{benchmark-run}, @code{benchmark-run-compiled} and
+@code{benchmark-progn} in @file{benchmark.el}.  You can also use the
+@code{benchmark} command for timing forms interactively.
 
 @c Not worth putting in the printed manual.
 @ifnottex
index ff613ecd414fb65a7d57ec84f385451b09b5df5b..ab3bbd10995ff3c8609a4a64cc23bb863e57bb2d 100644 (file)
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -2399,6 +2399,12 @@ scrolling.
 \f
 * 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'.
 This function works like 'read-char', but maintains a history that can
 be navigated via the 'M-p'/'M-n' keystrokes.
index 8f12858b03327c19b29d946286d1af45c3689014..278fb807fd5215bdd557ca7b87c22e105d726583 100644 (file)
@@ -107,6 +107,30 @@ For non-interactive use see also `benchmark-run' and
       (message "Elapsed time: %fs (%fs in %d GCs)" (car 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)
 
 ;;; benchmark.el ends here